解决不能将DataTable数据批量更新到数据库的问题

问题描述:从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();

     }

 }

猜你喜欢

转载自blog.csdn.net/huzhizhewudi/article/details/84330396
今日推荐