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()最慢。

时间: 2024-12-14 18:13:54

DataTable批量插入数据库的相关文章

DataTable 批量插入SqlServer数据库 使用:SqlBulkCopy

简单使用: private void UpdateTitle(DataTable dt) { if (dt != null && dt.Rows.Count > 0) { using (SqlBulkCopy sbc = new SqlBulkCopy(SqlHelper.connectionString)) { sbc.BatchSize = dt.Rows.Count;//每批次操作数量 sbc.BulkCopyTimeout = 60;//操作允许的超时时间 单位:秒 (超时则

使用SqlBulkCopy将DataTable中的数据批量插入数据库中

#region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致. /// </summary> /// <param name="conStr">数据库连接串</param> /// <param name="strTableName">数据库中对应的表名</param> //

Java MySql 批量插入数据库addBatch

//addBatch批量插入数据库 public static void insertCommentToMySql(Set<String> commentList) { Iterator<String> it = commentList.iterator(); Statement st=null; try { st = DBConnection.getConnection(dbName,dbUser,dbPwd).createStatement(); } catch (SQLExc

MYSQL批量插入数据库实现语句性能分析

假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL ) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example (example_id, name, value, other_value)

Word中表格内容批量插入数据库

一.内容概要 1,下载jacob.jar,将jacob自带的DLL放入SYSTEM32中,确保电脑装了WORD程序: 2,方法是:FILE[]遍历特定文件夹,JACOB读取WORD中表格的内容,封装成arraylist,然后批量插入数据库 二.核心码 1,words.java;遍历文件夹,取出word表格中的内容到arraylist package main.java.utils; import java.io.File;//用于遍历文件夹下所有文件 import java.util.Array

批量插入数据库数据,有则更新,无则追加

# 批量插入数据库数据,有则更新,无则追加import pymysqlimport numpy as npimport pandas as pdconn = pymysql.connect( host='127.0.0.1', port=3306, user='root', passwd='root', db='py3_userinfo', charset='utf8' )# 游标cur = conn.cursor()df = pd.DataFrame([['合肥', 12, 110],['北京

.net 使用SqlBulkCopy批量插入数据库

//一次批量插入100W条数据到数据库 static void Main(string[] args) { System.Random a = new Random(System.DateTime.Now.Millisecond); Stopwatch sw = new Stopwatch(); DataTable dt = GetTableSchema(); for (int count = 0; count < 1000000; count++) { DataRow r = dt.NewRo

MyBatis Oracle 使用序列批量插入数据库

由于现在项目昨晚批处理作业抽取数据主键生成器出现了问题,紧急解决用序列作为主键.   底层使用MyBatis与Oracle 数据库库交互. 和度娘交谈了很久她都没有给出解决方案.为   此自己写了想了一种方式,没想到一次测试完全通过.   大致demo如下  java 代码  1 /** 2 * 文件名称: InsertBatch 3 * 内容摘要: 测试 MyBatis 使用序列批量插入 4 * 创 建 人: sunrise 5 * 创建日期:2015-6-18 下午9:16:06 6 * 修

大数据批量插入数据库使用(SqlBulkCopy )效率更高

SqlBulkCopy类是System.Data.SqlClient下的类,我们开发中不常用,甚至不知道有这么一个类的存在,但确实比sql插入,事务批量插入,sql批量拼接插入快很多,比调用存储过程插入方便 下面是它的用法: public static bool ExecuteTransactionScopeInsert(DataTable dt, int batchSize) { int count = dt.Rows.Count; string tableName = "TestTable&