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. 

Почему это исключение происходит?

«Неожиданная существующая транзакция» … Почему это исключение происходит?

Это происходит потому, что использование конструктора 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; } } 
  • Импорт SQL Server быстрее, чем массовый импорт.
  • Как использовать SqlBulkCopy с нулевыми столбцами
  • SqlBulkCopy автоматически запускает транзакцию?
  • SQLBulkCopy Загружает любые данные при сбое?
  • Как получить идентификаторы вставленных записей данных с помощью SQL bulk copy
  • Как оптимизировать импорт данных в SQL Server с 100000 записей с 100 одновременными пользователями
  • SQL Server Альтернатива повторному копированию столбца идентификации
  • размер партии крупноформатной бумаги, влияющий на вставку
  • Альтернатива удалению триггера для отслеживания удаленных записей
  • SqlBulkCopy.WriteToServer () продолжает получать «соединение закрыто»
  • Триггер запуска для каждой вставленной строки с использованием SqlBulkCopy
  • Interesting Posts

    Необходимо объединить две группы по запросам

    Как реализовать доступную через Интернет систему с помощью Delphi?

    Будет ли эта транзакция отменена, если произойдут ошибки

    Разделить значения на отдельные строки

    Как перенастроить значение в зависимости от двух значений столбца в заявлении на выбор SQL-сервера?

    Как правильно получить доступ к связанным полям таблицы с помощью лямбда?

    Как объединить оператор IN с условием LIKE (или лучший способ получить сопоставимые результаты)

    неверно сформировано семейство носителей на устройстве. SQL Server не может обработать это семейство мультимедиа

    Ошибка 26 на SQL Server 2008

    Объекты схемы не отображаются в SQL Server Management Studio 2008

    Поиск нескольких вхождений слова из строки в SQL Server

    SQL Select Match

    Строка SQL Concatenate в результате

    Расчет цены, основанной на изменении почасовых ставок

    Как создать соединение?

    Давайте будем гением компьютера.