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