SqlBulkCopy - 意外的现有事务
本文关键字:事务 意外 SqlBulkCopy | 更新日期: 2023-09-27 18:33:23
我正在使用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.
为什么会发生此异常?
"意外的现有交易" ...为什么会发生此异常?
发生这种情况是因为在不指定事务的情况下使用 SqlBulkCopy
构造函数将在内部创建自己的事务。
通过创建事务,然后使用它来创建SqlBulkCopy
来避免这种情况。 可以使用要使用的事务创建SqlBulkCopy
,如下所示:
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
{
您需要使用接收事务的构造函数,以便 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;
}
}