insert与DataAdapter.update()哪个效率高?

humozhi 2009-03-29 08:41:27
最近在写一个数据导入的程序,从excel中读取数据,再插入到db中,如果采用insert语句或procedure逐行插入数据,每次都需要sqlconnection.open(),sqlconnection.close(),我想是不是会产生很大的开销。而DataSet自身带有update的方法,听说可以打批量的插入数据,而且性能很高。所以我写了个程序测试一下写入的速度(代码如下),但是另我惊讶的是测试结果如下:
生产数据条数:10000
insert插入10000条记录时间:00:00:04.8593750
dataset.update插入10000条记录时间:00:00:05.5781250
为什么会这样呢,不是说insert的系统开销大于dataset.update()的吗?请各位指点。
另外,还有什么更好,效率更高的数据批量插入DB的方法。谢谢。


private void testinputdate()
{
DateTime startdate = DateTime.Now;
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");
Console.WriteLine("执行查询时间:{0}",(DateTime.Now - startdate).ToString());

startdate=DateTime.Now;
DataTable datatable = dataset.Tables[0];
for (int i = 0; i < 100000; 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);
}
Console.WriteLine("生成数据时间:{0}", (DateTime.Now - startdate).ToString());
Console.WriteLine("生产数据条数:{0}", datatable.Rows.Count);

//使用insert
startdate = DateTime.Now;
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();
}
}
Console.WriteLine("插入{0}条记录时间:{1}", datatable.Rows.Count, DateTime.Now - startdate);


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;

//使用dataadapter.update
startdate = DateTime.Now;
sqldataadapter.Update(dataset, "Table_1");
Console.WriteLine("插入{0}条记录时间:{1}", datatable.Rows.Count, DateTime.Now - startdate);
}
...全文
1784 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
火星大能猫 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sp1234 的回复:]
引用楼主 humozhi 的帖子:
foreach (DataRow datarow in datatable.Rows)
{
string sql = "INSERT INTO [Table_1]([CompanyName],[CompanyCode],[Address],[Owner],[Memo])" +
"VALUES('" + datarow["CompanyName"].ToS……
[/Quote]

这个还真的学习了,虽然做了好久的开发了.一直忽视这个问题.
扫帚油松 2010-04-06
  • 打赏
  • 举报
回复
学习了
liuxiuming 2010-02-25
  • 打赏
  • 举报
回复
把sqlconnection.close()放到最后不就行了?为什么要每次都关?
小范f-li.cn 2009-11-30
  • 打赏
  • 举报
回复
up
EsMo 2009-04-08
  • 打赏
  • 举报
回复
有两个问题
1 能不能支持连表查询
2 连表后的查出的数据 可能没有主键 或者没有唯一标识
以上两点 是不是智能用 insert来解决
humozhi 2009-04-08
  • 打赏
  • 举报
回复
问题已经解决了,大家可以去看看我博客上的文章,同时上面有我的测试记录。
地址如下:
http://blog.csdn.net/humozhi/archive/2009/03/31/4039868.aspx
zhnzzy 2009-04-06
  • 打赏
  • 举报
回复
你测试了几次,用了几台机器,这样光光一下子测试是说明不了问题的.这种差别是微弱的
freewind0521 2009-04-06
  • 打赏
  • 举报
回复

//使用insert
startdate = DateTime.Now;
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();
}
}
Console.WriteLine("插入{0}条记录时间:{1}", datatable.Rows.Count, DateTime.Now - startdate);


不应该在循环中每次打开关闭数据库,应该放在循环的外面开关一次就可以了
uncleson88 2009-04-06
  • 打赏
  • 举报
回复
dataadapter应该也就是调用的 insert 吧~~~
感觉上两者不会相差多少,
还有,不用每次都 打开数据库啊,打开一次就行了
ourola 2009-04-06
  • 打赏
  • 举报
回复
DataAdapter.Update的性能远远优于Insert.
请关注DataAdapter的UpdateBatchSize属性.UpdateBatchSize用于获取设置每次使用DataAdapter.Update()更新时的条数.
使用 UpdateBatchSize 属性用来自 DataSet 的更改更新数据源。如果数据提供程序支持批处理,将可以提高应用程序的性能,这是因为到服务器的往返过程的次数减少了。在 ADO.NET 2.0 中,对用于 SQL Server (SqlClient) 和 Oracle (OracleClient) 的 .NET 数据提供程序支持此属性。

UpdateBatchSize值不能设置过大,执行极大规模的批处理会降低性能。因此,在实现应用程序前应进行测试以得到最佳的批大小。

该UpdateBatchSize值默认为1.
热学沸腾56 2009-04-04
  • 打赏
  • 举报
回复
来接分的,帮顶!
冷月孤峰 2009-04-04
  • 打赏
  • 举报
回复
Insert()比DataSet的update()效率高!
特别是当数据量大了以后DataSet的update()效率就会下降!

不需要 每次都需要sqlconnection.open(),sqlconnection.close()!
楼主可以将数据整理好后,一次性进行插入。
beckfun 2009-04-04
  • 打赏
  • 举报
回复
DataSet归根到底还是insert。
xufzu123 2009-04-04
  • 打赏
  • 举报
回复
学习了~~
PandaIT 2009-04-04
  • 打赏
  • 举报
回复
insert常用的东西
vrhero 2009-04-04
  • 打赏
  • 举报
回复
如果采用insert语句或procedure逐行插入数据,每次都需要sqlconnection.open(),sqlconnection.close()
---------------
没有人规定过“每次都需要sqlconnection.open(),sqlconnection.close()”...相反这种做法是被摈弃的...

DataSet不是以性能见长的,它的优点是减少与数据源的交互...某些时候看起来性能高实际上只是因为在本机处理没有网络延时而已...

就insert而言同样条件下DataSet不可能比其他方式更快...
阿达King哥 2009-04-04
  • 打赏
  • 举报
回复
我觉得你可以把这个放在存储过程中去执行,再看看速度。
十八道胡同 2009-04-04
  • 打赏
  • 举报
回复
我觉得试验多组数据可信,50000呢?100000呢?
这2个我没用过,不敢妄加评论。
帮顶!
a12321321321312321 2009-04-04
  • 打赏
  • 举报
回复
顶下
jinsuo_1986 2009-04-04
  • 打赏
  • 举报
回复
友情UP
加载更多回复(20)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧