我正在使用SQLBulkCopy来移动大量数据。我实现了通知事件,以便在每次处理了一定数量的行时通知我,但在作业完成时不会触发OnSqlRowsCopied事件。如何在SQLBulkCopy写入器完成时获取复制的总行数?
发布于 2009-07-27 14:20:14
我认为您必须在完成后对表运行COUNT()查询,就像在MSDN示例here中一样。
除此之外,你不能提前告诉我吗?例如,如果您将一个DataTable传递给WriteToServer(),那么您可以通过对其执行.Rows.Count来知道有多少条记录。
发布于 2010-12-18 04:11:37
以下黑客攻击(使用反射)是一种选择:
/// <summary>
/// Helper class to process the SqlBulkCopy class
/// </summary>
static class SqlBulkCopyHelper
{
static FieldInfo rowsCopiedField = null;
/// <summary>
/// Gets the rows copied from the specified SqlBulkCopy object
/// </summary>
/// <param name="bulkCopy">The bulk copy.</param>
/// <returns></returns>
public static int GetRowsCopied(SqlBulkCopy bulkCopy)
{
if (rowsCopiedField == null)
{
rowsCopiedField = typeof(SqlBulkCopy).GetField("_rowsCopied", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
}
return (int)rowsCopiedField.GetValue(bulkCopy);
}
}
然后按如下方式使用该类:
int rowsCopied = SqlBulkCopyHelper.GetRowsCopied(bulkCopyObjectInYourCode);
希望这能有所帮助。
发布于 2017-06-16 01:08:02
下面是我所做的--这是对Rahul Modi在这个线程中的解决方案的轻微修改(基本上它只是将SqlRowsCopied事件内联起来,我认为在这个实例中这比创建新的事件处理程序方法要干净一些):
private long InsetData(DataTable dataTable, SqlConnection connection)
{
using (SqlBulkCopy copier = new SqlBulkCopy(connection))
{
var filesInserted = 0L;
connection.Open();
copier.DestinationTableName = "dbo.MyTable";
copier.NotifyAfter = dataTable.Rows.Count;
copier.SqlRowsCopied += (s, e) => filesInserted = e.RowsCopied;
copier.WriteToServer(dataTable);
connection.Close();
return filesInserted;
}
}
https://stackoverflow.com/questions/1188384
复制相似问题