SqlBulkCopy的缺点是什么?

9

我为“使用C#将大量数据插入数据库的最佳方法”做了一些研究,很多人建议我使用SqlBulkCopy。我试用了一下,真的非常快。毫无疑问,SqlBulkCopy是一个完美的插入数据(特别是大量数据)的方式。但是,为什么我们不总是使用它呢?使用SqlBulkCopy有什么缺点吗?

2个回答

13

SqlBulkCopy也适用于Oracle v11,但是必须在安装Oracle Client时获取Oracle.NET程序集以提供支持。 SqlBulkCopy类基本上是由目标数据库引擎的提供者单独实现的。

然而,有一个巨大的缺点 - 它绝对没有错误报告。例如,如果您已经使用DataAdapter更新了DataSet中的数据,并将其刷新回数据库,但存在关键冲突(或任何其他故障),那么罪魁祸首的DataRow将会被设置为.HasErrors为true,当它被抛出时,您可以将其添加到异常消息中。

使用SqlBulkCopy时,您只能获得错误类型,仅此而已。祝您调试好运。


2
完全同意调试是BulkCopy的一个问题。我采用的一种方法是在finally块中“拆解”失败的BulkCopy命令,并逐行插入。这样,我就可以将有问题的DataRow作为我的错误报告的一部分来确定。 - Totero
1
我发现在错误报告方面,有一种方法可以获取单个失败的记录,但它确实需要将批量复制重新提交为一页一页的记录,然后捕获和抛出所有异常(以及罪犯行)。这不是最有效的方法,但只会在出现错误时发生,所以还好。请参阅此处的完整文章:http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc - David Catriel

10

我可以想到两个原因:

  1. 据我所知,它仅适用于Microsoft SQL Server。
  2. 在许多正常的工作负载中,您不会进行批量插入,而是偶尔插入与选择和更新混合的情况。Microsoft本身指出,对于这种情况,普通的插入更有效率,在SqlBulkCopy MSDN页面上有说明。

请注意,如果您希望SqlBulkCopy等效于普通插入,至少需要向其传递SqlBulkCopyOptions.CheckConstraints参数。


是的,SqlBulkCopy只能与MS SQL Server一起使用。这也是我知道的唯一缺点之一。有时它并不是真正的大问题。例如:我们的客户仅使用MS SQL Server,而我们只为他们构建属于System.Data.SqlClient命名空间的几个类的应用程序。 - Edison Chuang
为什么 SqlBulkCopyOptions.CheckConstraints 默认为 false?这太不符合直觉了! - Barry Kaye
3
不,它不是这样的。名称为“批量复制”,因此您应该复制已知约束条件正确的数据,否则您就不知道自己在做什么... :) - Tamara Wijsman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接