2011-10-14 43 views
4

我要做几个插入到一个表中。现在,我列出了迭代的对象列表,对于每个对象,我使用insert语句执行ExecuteNonQuery。几个插入性能c#

我想知道是否有紧固的方式来做到这一点。 这样,插入800个寄存器需要几分钟的时间。

我在Java中使用了executeBatch方法,对于这个建议,谁在C#中有类似的东西。

问候!

回答

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(); 
} 

我只会考虑方法是否限制交易的数量(从而提交)不足以满足功能要求。

快乐编码。

+0

我已经使用事务作用域(在业务层),所以我认为只有一个提交时tx.Complete() – Keetah

+1

@Rodrigo只是验证它真的被使用 - 在几分钟内800提交*真的很慢*。我无法想象,即使是过度索引和/或不好的碎片化也会导致这种情况(但我更为惊讶;-)。还要验证服务器的延迟是否可以接受; [高]延迟将成为限制单个命令速度的问题。 (延迟50ms将最大单独命令/秒减少到约20;因此可能是发送较少单个命令的非常好的候选者。如果相关,将这些信息包括在帖子中。) – 2011-10-14 01:11:32

+0

我正在尝试通过VPN进程通过互联网,所以也许是问题。我如何检查延迟 – Keetah

1

你的语句可能是这样的:

insert into my_table (field1, field2, ...) 
values (row1_value1, row2_value2, ...), 
     (row2_value1, row2_value2, ...), ... 

因此,如果您创建例如一个StringBuilder,您可以批了20个,50个或100插入,并发出要少得多插入语句。

+0

是的,这是一种方式,我只是觉得我可能是一个更好的方法来做到这一点。只是一个问题,你添加连接字符串的值?或使用动态名称向命令添加参数? – Keetah

+0

我尝试添加参数到命令,但我有一个例外,因为我超过了参数限制(2100?)。我能怎么做 ? – Keetah

+0

@Rodrigo:你插入了多少列?换句话说,如果你将2100除以列数,你还能批量处理大量的行吗?如果是的话,坚持这个限制。如果不是,请自己格式化字符串(不要忘记转义特殊字符,如引号!!) –

0

如何在由';'分隔的字符串中写入所有插入语句?并将此字符串传递给ExecuteNonQuery?

检查错误只是比较插入的次数与受影响的是的ExecuteNonQuery返回

+0

您也可以创建一个存储过程,它接收XML参数 –