SqlBulkCopy – Неожиданная существующая транзакция
Я использую 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.
Почему это исключение происходит?
- Ошибка BulkCopy: идентификатор локали '1025' исходного столбца 'CreatedBy' и идентификатор локали '1033' столбца назначения 'CreatedBy' не совпадают
- Есть ли способ использовать SqlBulkCopy без преобразования данных в DataTable?
- Каким образом можно вставить миллионы записей из файла csv в базу данных SQL Server?
- Ошибка SQLBulkCopy 40197 с кодом% d 4815 (соединение принудительно закрыто)
- Запись из таблицы SQL Server в файл с использованием BCP
- Повторяющийся SQLBulkCopy для SQL Server 2008 R2
- Использование SQLBulkCopy - Значительно большие таблицы в SQL Server 2016, чем в SQL Server 2014
- MySqlDataAdapter или MySqlDataReader для массового перевода?
- SQL BulkCopy против OPENDATASOURCE, который быстрее
- SqlBulkCopy и защита от SQL-инъекций
- Как захватить данные, переданные в SqlBulkCopy, используя Sql Profiler?
- SQL Server - не может импортировать столбец значений 0 или 1 в бит
- Загрузка CSV из Blob в Azure SQL Server. Не найден внешний источник внешних ссылок
«Неожиданная существующая транзакция» … Почему это исключение происходит?
Это происходит потому, что использование конструктора 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; } }