111*_*110 19 c# sql-server sqlbulkcopy sql-server-2008
我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;
}
Run Code Online (Sandbox Code Playgroud)
但我总是得到例外:
Unexpected existing transaction.
Run Code Online (Sandbox Code Playgroud)
为什么发生这种异常?
jlt*_*rem 38
"意外的现有交易"......为什么会发生这种异常?
这是因为在SqlBulkCopy没有指定事务的情况下使用构造函数将在内部创建自己的事务.
通过创建事务避免这种情况,然后使用它来创建SqlBulkCopy. SqlBulkCopy可以使用您要使用的事务创建,如下所示:
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
{
Run Code Online (Sandbox Code Playgroud)
您需要使用接受事务的构造函数,以便 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;
}
}
Run Code Online (Sandbox Code Playgroud)