请教大家SqlBulkCopy能否向多张表插入数据

善缘2022 2012-07-19 05:46:17
目前做项目是用的EntityFramework,需要一次性向2个表插入几千多条数据,现在是用的EF的AddObject,但是这个的效率不高,于是在网上找了下,说用SqlBulkCopy效率很高,实验后确实很快,10万条数据只要4秒钟,用ef要用40秒。但是看了下SqlBulkCopy好像一次只能向一张表插入数据,请问如何向多张表插入数据,如果回滚都不插入。
下面是部分代码:

//构造一个Datatable存储将要批量导入的数据
DataTable dt = new DataTable();
dt.Columns.Add("Rid", typeof(string));
dt.Columns.Add("Rname", typeof(string));
dt.Columns.Add("Rnumber", typeof(string));
dt.Columns.Add("Rstate", typeof(string));
dt.Columns.Add("isDel", typeof(string));
dt.Columns.Add("Ctime", typeof(DateTime));
dt.Columns.Add("Utime", typeof(DateTime));

// 见识下SqlBulkCopy强悍之处,来个十万条数数据试验
int i;
for (i = 0; i < Convert.ToInt32(drpNum.SelectedValue); i++)
{
DataRow dr = dt.NewRow();
dr["Rid"] = Guid.NewGuid().ToString();
dr["Rname"] = "测试数据" + i.ToString();
dr["Rnumber"] = "i";
dr["Rstate"] = "1";
dr["isDel"] = "1";
dr["Ctime"] = DateTime.Now ;
dr["Utime"] = DateTime.Now;
dt.Rows.Add(dr);
}

string str = ConfigurationManager.ConnectionStrings["conn"].ConnectionString.ToString();
//声明数据库连接
SqlConnection conn = new SqlConnection(str);

conn.Open();
//声明SqlBulkCopy ,using释放非托管资源
using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
{
//一次批量的插入的数据量
sqlBC.BatchSize = 1000;
//超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
sqlBC.BulkCopyTimeout = 60;

//設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。
sqlBC.NotifyAfter = 10000;
sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

//设置要批量写入的表
sqlBC.DestinationTableName = "dbo.TZ_Resident";

//自定义的datatable和数据库的字段进行对应 ,如果表结构一样就不需要写对应关系了。
sqlBC.ColumnMappings.Add("Rid", "Rid");
sqlBC.ColumnMappings.Add("Rname", "Rname");
sqlBC.ColumnMappings.Add("Rnumber", "Rnumber");
sqlBC.ColumnMappings.Add("Rstate", "Rstate");
sqlBC.ColumnMappings.Add("isDel", "isDel");
sqlBC.ColumnMappings.Add("Ctime", "Ctime");
sqlBC.ColumnMappings.Add("Utime", "Utime");

//批量写入
sqlBC.WriteToServer(dt);
}
conn.Dispose();
...全文
228 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
善缘2022 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
错了。。。。
using(SqlConnection conn = new SqlConnection(str))
{
SqlTransaction st= conn.BeginTransaction();
using (SqlBulkCopy sqlBC1 = new SqlBulkCopy(conn,SqlBulkCopyOptions.Default,st))
{
……
[/Quote]
十分感激,我试试。
手抓宝 2012-07-20
  • 打赏
  • 举报
回复
错了。。。。
using(SqlConnection conn = new SqlConnection(str))
{
SqlTransaction st= conn.BeginTransaction();
using (SqlBulkCopy sqlBC1 = new SqlBulkCopy(conn,SqlBulkCopyOptions.Default,st))
{
。。。
}
using (SqlBulkCopy sqlBC2 = new SqlBulkCopy(conn,SqlBulkCopyOptions.Default,st))
{
。。。
}
using (SqlBulkCopy sqlBC3 = new SqlBulkCopy(conn,SqlBulkCopyOptions.Default,st))
{
。。。
}
}
手抓宝 2012-07-20
  • 打赏
  • 举报
回复
你可以这样。。
using(SqlConnection conn = new SqlConnection(str))
{
using(SqlBulkCopy sqlBC1 = new SqlBulkCopy(conn))
{
.....
}
using(SqlBulkCopy sqlBC2 = new SqlBulkCopy(conn))
{
.....
}
using(SqlBulkCopy sqlBC3 = new SqlBulkCopy(conn))
{
.....
}
}
手抓宝 2012-07-20
  • 打赏
  • 举报
回复
WriteToServer的几个重载都没有DataSet的,说明他只能对一张目标表进行操作。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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