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()正在返回一个包装的连接,这有助于防止我不断地管理我的连接。

+0

我不知道它是否简单。尝试在每次上传后关闭SQLBulkCopy(如果您尚未这样做)。 –

我不确定你的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(); 

让我知道如果这可以帮助你。