Я использую 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;
}
}