SqlBulkCopy成功但没有插入记录
问题描述:
我试图插入大量的记录到各种表中。我无法将所有记录一次写入内存,因此我使用IDataReader
实现将一些数据放入内存,然后使用SqlBulkCopy
将其转储到数据库中。SqlBulkCopy成功但没有插入记录
我遇到的问题是,我第二次尝试写入表时,SqlBulkCopy
会成功,但无法实际插入记录。我原以为这是一个交易问题,但我禁用了我所有连接上的所有交易,但仍然看到同样的问题。我也可以在代码和外部之前和之后独立地确认表格的大小。
下面的代码片段:
long before = GetCount(tableName);
DataServerConnection conn = GetConnection();
using (var batch = conn.HasTransaction ?
new SqlBulkCopy((SqlConnection)conn.IDbConnection, SqlBulkCopyOptions.Default, (SqlTransaction)conn.Transaction) :
new SqlBulkCopy((SqlConnection)conn.IDbConnection))
{
batch.DestinationTableName = tableName;
batch.WriteToServer(reader);
}
long after = GetCount(tableName);
if ((reader.Count + before) != after)
{
throw new Exception($"Not all records inserted: Before = {before}, After = {after}, Reader Count = {reader.Count}, Expected = {reader.Count + before}");
}
任何想法我很想念? GetCount(tableName)
是做一个简单的
SELECT COUNT(*) FROM [{tableName}]
reader
是一个基本的IDataReader
实现,我已经验证的作品上百万的记录等地。 GetConnection()
正在返回一个包装的连接,这有助于防止我不断地管理我的连接。
答
我不确定你的reader变量是如何声明的,所以我会告诉你我是如何做到的(这并不意味着它是最好的方法)。
首先我声明基于数据集我有一个TableAdapter:
DataSetTableAdapter.MyTableAdapter dataTable = new DataSetTableAdapter.MyTableAdapter();
然后,我创建连接。
SqlConnection sql = new SqlConnection(...);
然后是BulkCopy变量:
SqlBulkCopy insertData = new SqlBulkCopy(sql);
一旦我有这个,我开始添加行表适配器是这样的:
dataTable.AddMyTableRow(...);
当我完成后,我做的批量插入:
sql.Open();
insertData.DestinationTableName = "MyTable";
insertData.WriteToServer(dataTable);
sql.Close();
让我知道如果这可以帮助你。
我不知道它是否简单。尝试在每次上传后关闭SQLBulkCopy(如果您尚未这样做)。 –