writetoserver sqlbulkcopyoptions net example ejemplo columnmappings column bulkcopy c# sql-server sql-server-2008 sqlbulkcopy

c# - net - sqlbulkcopyoptions



SqlBulkCopy-Transacción existente inesperada (2)

Estoy usando SqlBulkCopy para insertar una gran cantidad de datos:

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; }

Pero siempre tengo una excepción:

Unexpected existing transaction.

¿Por qué sucede esta excepción?


"Transacción existente inesperada" ... ¿Por qué ocurre esta excepción?

Esto sucede porque el uso del constructor SqlBulkCopy sin especificar una transacción creará su propia transacción internamente.

Evite esto creando su transacción y luego SqlBulkCopy para crear la SqlBulkCopy del SqlBulkCopy . SqlBulkCopy se puede crear con la transacción que desea utilizar, como esta:

connection.Open(); using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted)) { using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran)) {


Debe usar el constructor que toma la transacción para que SqlBulkCopy esté al tanto de la transacción.

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; } }