问题描述:从excel文件使用OLEDB方式读取数据到DataTable中,然后将DataTable数据更新到access数据库,这时由于DataTable中的每一行的RowStated状态都是unChanged而无法通过UpdateCommand方式更新到数据库。
解决方法:将从excel文件读取的数据存储到dt1(DataTable类型)中,然后将dt1的每行数据分别拷贝给row(DataRow类型),将row依次加入到dt_result(DataTable)类型,然后将dt_result使用UpdateCommand方式批量导入到access数据库。
方法一:
DataTable dt = ExcelHelper.FastGetDataFromExcel(“C:\\test.xls”);
BatchUpdateDatabase (dt, “test”)
方法二:
DataTable dt = ExcelHelper.FastGetDataFromExcel(“C:\\test.xls”);
BatchUpdateDatabase (this.CopyDataTable(dt), “test”)
方法一无法更新到数据库,但是方法二可以。
/// <summary>
/// 通过OLEDB方式从excel读取数据
/// </summary>
/// <param name="fullFileName">excel文件名</param>
/// <returns>获取读取数据的表</returns>
static public DataTable FastGetDataFromExcel(string fullFileName)
{
string strCon =string.Format("Provider=Microsoft.Ace.OLEDB.12.0;Data Source='{0}';Extended Properties="+
"'Excel 8.0;HDR=YES;IMEX=1;'", fullFileName);
OleDbConnection oldCon=null;
try
{
oldCon = new OleDbConnection(strCon);
oldCon.Open();
int index = fullFileName.LastIndexOf("\\");
string fileName=fullFileName.Substring(index+1,fullFileName.Length-index-1);
string sql = "select * from [sheet1$]";
OleDbDataAdapter adp = new OleDbDataAdapter(sql,oldCon);
DataTable dt = new DataTable();
adp.Fill(dt);
return dt;
}
catch (Exception e)
{
throw e;
}
finally
{
oldCon.Close();
}
}
private DataTable CopyDataTable(DataTable dt_source)
{
DataTable dt_result = dt_source.Clone();
dt_result.Rows.Clear();
int N = dt_source.Columns.Count;
foreach (DataRow row in dt_source.Rows)
{
DataRow myrow = dt_result.NewRow();
myrow.ItemArray = row.ItemArray;
dt_result.Rows.Add(myrow);
}
return dt_result;
}
/// <summary>
/// 使用datatable数据批量更新数据库(ACCESS)
/// </summary>
/// <param name="dt">数据表</param>
/// <param name="tableName">数据库中对应表的表名</param>
/// <returns></returns>
public bool BatchUpdateDatabase(DataTable dt, string tableName)
{
try
{
this.OpenConnection();
OleDbDataAdapter sda = new OleDbDataAdapter();
string sql = string.Format("select * from {0}", tableName);
sda.SelectCommand = new OleDbCommand(sql, cnn);
OleDbCommandBuilder builder = new OleDbCommandBuilder(sda);
//sda.UpdateCommand = builder.GetUpdateCommand();
sda.InsertCommand = builder.GetInsertCommand();
int n=sda.Update(dt);
dt.AcceptChanges();
return n>0?true:false;
}
catch (Exception e)
{
throw e;
}
finally
{
this.CloseConnection();
}
}