为了账号安全,请及时绑定邮箱和手机立即绑定

使用 SqlBulkCopy 查询

使用 SqlBulkCopy 查询

C#
一只萌萌小番薯 2022-01-09 10:46:05
我有一个参数化查询,出于演示目的,我们假设它是SELECT Id, Name FROM People WHERE Age >= @Age假设这可能是数百万条记录,我想将这些记录批量加载到 table 中Population (Id, Name)。通过遵循我看到的大多数示例,SqlBulkCopy我将使用第一个查询来获取数据表,然后我可以将该数据表批量加载到Population但我不需要读取查询,将其放入内存中只是为了再次写入。本质上,我希望将查询批量加载到表中,而不必在 C# 中读取查询,所有 IO 都应该发生在数据库中。我该怎么做?这是我的尝试:using (var conn = new SqlConnection(SomeConnectionString))using (var cmd = conn.CreateCommand()){    conn.Open();    cmd.CommandText = "SELECT Id, Name FROM People WHERE Age >= @Age";    cmd.Parameters.AddWithValue("@Age", 10);    using (var reader = cmd.ExecuteReader())    using (SqlBulkCopy bulkcopy = new SqlBulkCopy(SomeConnectionString))    {        bulkcopy.DestinationTableName = "[Population]";        bulkcopy.WriteToServer(reader);        bulkcopy.Close();    }}我不确定是否ExecuteReader只是设置一个指针开始读取或实际将查询读入内存。在有人建议执行查询之前INSERT INTO Population    SELECT Id, Name     FROM People     WHERE Age >= @Age知道我要批量加载的查询将作为变量(带有参数)进入,因为我不知道查询将是什么,只是我希望它能够很好地映射并且我希望它批量加载。
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

根据评论:

如果没有 MARS,除了使用 DataTable 并将其用于 SqlBulkCopy 之外别无他法,因为当数据读取器仍处于打开状态时,您无法使用相同的连接进行批量复制。您必须关闭第一个连接才能稍后与 SqlBulkCopy 一起使用。


查看完整回答
反对 回复 2022-01-09
  • 1 回答
  • 0 关注
  • 352 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号