我在一个表中做了几次插入。现在,我已经迭代了一个对象列表,对于每个对象,我使用insert语句执行一个ExecuteNonQuery。
我想知道是否有紧固的方法来做到这一点。 这样,插入800个寄存器需要几分钟。
我在Java中使用了executeBatch方法,对于这个提议,c#中有类似的东西。
问候!
答案 0 :(得分:5)
插入相对快速/便宜。 提交缓慢/昂贵。
除非它是高延迟连接,否则多个(如数百个)插入语句应该没问题。
“......需要几分钟......”听起来好像没有使用交易(因此可能有800次提交 - 哎哟!)。在C#中控制事务的最简单方法之一是使用TransactionScope:
using (var connection = ...)
using (var tx = new TransactionScope()) {
foreach (var row in rows) {
// insert row
}
// commit all at once
tx.Complete();
}
如果限制交易数量(因此提交)不足以满足功能要求,我只会考虑方法。
快乐的编码。
答案 1 :(得分:1)
您的陈述可能是这样的:
insert into my_table (field1, field2, ...)
values (row1_value1, row2_value2, ...),
(row2_value1, row2_value2, ...), ...
因此,如果您创建一个StringBuilder,您可以批量处理20,50或100个插入并发出更少的插入语句。
答案 2 :(得分:1)
如果您想从.NET应用程序中执行所有操作,请查看Performing Batch Operations Using DataAdapters (ADO.NET)。
如果您希望获得最快的性能,可以使用bcp utility(假设您正在使用SQL Server。)您可以将数据写入分隔文件并使用bcp执行插入。
答案 3 :(得分:0)
如何将所有插入语句写入以';'分隔的字符串中并将此字符串传递给ExecuteNonQuery?
检查错误只是比较插入数量与受影响的行ExecuteNonQuery返回