zoukankan      html  css  js  c++  java
  • DataTable批量插入数据库

    DataTable批量插入数据库  

     

    最近在将excel中的文件导入到数据库中,用程序进行编写,由于数据量较大所以速度很慢,后来采用了SqlBulkCopy类,解决了速度的问题,我就insert语句,sqldataadapter.update(dataset,tablename);sqlbulkcopy.WriteToServer(datatable);三个方法的性能进行比较:

    1、生成测试的datatable表,表结构如下:

    UniqueID(主键,自动增长) | CompanyName | CompanyCode | Address | Owner | Memo

    共6个字段。

    SqlConnection sqlconnection = new SqlConnection(connectionString);
    SqlDataAdapter sqldataadapter = new SqlDataAdapter("select * from Table_1 where 1=2", sqlconnection);
    DataSet dataset = new DataSet();
    sqldataadapter.Fill(dataset, "Table_1");
    DataTable datatable = dataset.Tables[0];
    //生成20000条记录

    for (int i = 0; i < 20000; i++)
    {
              DataRow datarow = datatable.NewRow();
              datarow["CompanyName"] = "companyname"+string.Format("{0:0000}",i);
              datarow["CompanyCode"] = "companycode" + string.Format("{0:0000}", i);
              datarow["Address"] = "address" + string.Format("{0:0000}", i);
              datarow["Owner"] = "owner" + string.Format("{0:0000}", i);
              datarow["Memo"] = "memo" + string.Format("{0:0000}", i);

              datatable.Rows.Add(datarow);
    }

    2、使用sqlcommand.executenonquery()方法插入

    foreach (DataRow datarow in datatable.Rows)
    {
    string sql = "INSERT INTO [Table_1]

    ([CompanyName],[CompanyCode],[Address],[Owner],[Memo])" +
    "VALUES('" + datarow["CompanyName"].ToString() + "'" +
    ",'" + datarow["CompanyCode"].ToString() + "'" +
    ",'" + datarow["Address"].ToString() + "'" +
    ",'" + datarow["Owner"].ToString() + "'" +
    ",'" + datarow["Memo"].ToString() + "')";
    using (SqlConnection sqlconn = new SqlConnection(connectionString))
    {
          sqlconn.Open();

          SqlCommand sqlcommand = new SqlCommand(sql, sqlconn);
          sqlcommand.ExecuteNonQuery();
          sqlconn.Close();
    }
    }

    插入20000条记录时间:00:00:29.7336000

    3、使用sqldataadapter.update(dataset,tablename);

    SqlCommand insertcommand = new SqlCommand("INSERT INTO [Table_1]([CompanyName],[CompanyCode],[Address],[Owner],[Memo])" +
    "VALUES(@CompanyName, @CompanyCode,@Address,@Owner,@Memo)",new SqlConnection(connectionString));
    insertcommand.Parameters.Add("@CompanyName", SqlDbType.NChar, 50, "CompanyName");
    insertcommand.Parameters.Add("@CompanyCode", SqlDbType.NChar, 25, "CompanyCode");
    insertcommand.Parameters.Add("@Address", SqlDbType.NChar, 255, "Address");
    insertcommand.Parameters.Add("@Owner", SqlDbType.NChar, 25, "Owner");
    insertcommand.Parameters.Add("@Memo", SqlDbType.NChar, 255, "Memo");
    sqldataadapter.InsertCommand = insertcommand;

    sqldataadapter.Update(dataset, "Table_1"); 

    插入20000条记录时间:00:00:22.8938000

    4、使用sqlbulkcopy.writetoserver(datatable)(日白得很说:这种方法只有SQL-Server和Oracle 11G以后的版本才可以使用...现在我用的是10G...残念...)

    SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction);
    sqlbulkcopy.DestinationTableName = "Table_1";//数据库中的表名

    sqlbulkcopy.WriteToServer(dataset.Tables[0]);

    插入20000条记录时间:00:00:00.3276000

    所以说速度是sqlbulkcopy最快,sqldataadapter.update()次之,sqlcommand.ExecuteNonQuery()最慢。

  • 相关阅读:
    Ajax基础:3.Json
    Head First Design Patterns State Pattern
    Head First Design Patterns Template Method Pattern
    Articles For CSS Related
    Head First Design Patterns Decorator Pattern
    代码审查工具
    How To Be More Active In A Group
    Head First Design Patterns Factory Method Pattern
    Head First Design Patterns Composite Pattern
    Tech Articles
  • 原文地址:https://www.cnblogs.com/mfmz/p/3731663.html
Copyright © 2011-2022 走看看