我正在使用SqlBulkCopy
插入大量数据:
try
{
using (var bulkCopy = new SqlBulkCopy(connection))
{
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings.Add("...", "...");
using (var dataReader = new ObjectDataReader<MyObject>(data))
{
bulkCopy.WriteToServer(dataReader);
}
tran.Commit();
return true;
}
}
}
catch (Exception ex)
{
return false;
}
但我总是得到例外:
Unexpected existing transaction.
为什么会发生这种异常?
答案 0 :(得分:37)
“意外的现有交易”......为什么会发生这种异常?
这是因为在没有指定事务的情况下使用SqlBulkCopy
构造函数将在内部创建自己的事务。
通过创建交易来避免这种情况,然后使用它来创建SqlBulkCopy
。可以使用您要使用的事务创建SqlBulkCopy
,如下所示:
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
{
答案 1 :(得分:4)
您需要使用the constructor that takes in the transaction,以便SqlBulkCopy知道交易
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
{
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings.Add("...", "...");
using (var dataReader = new ObjectDataReader<MyObject>(data))
{
bulkCopy.WriteToServer(dataReader);
}
tran.Commit();
return true;
}
}