我在 .NET 3.5 中有一个自定义的数据导入可执行文件,SqlBulkCopy 基本上可以更快地插入大量数据。该应用程序基本上采用输入文件,处理数据并将其批量上传到 SQL Server 2000。它是由一位使用 SQL 2008 数据库环境构建它的顾问编写的。环境差异会导致这种情况吗?SQL 2000 确实具有 BulkCopy 所基于的 bcp 实用程序。所以,当我们运行它时,它触发了一个死锁错误。
错误详细信息:事务(进程 ID 58)与另一个进程在锁定资源上死锁,并已被选为死锁牺牲品。重新运行事务。
我已经尝试了很多方法来尝试解决它。比如临时设置连接字符串变量MultipleActiveResultSets=true,虽然不太理想,但还是会报死锁错误。我还确保这不是连接超时问题。
这是功能。有什么建议吗?
/// <summary>
/// Bulks the insert.
/// </summary>
public void BulkInsert(string destinationTableName, DataTable dataTable)
{
SqlBulkCopy bulkCopy;
if (this.Transaction != null)
{
bulkCopy = new SqlBulkCopy
(
this.Connection,
SqlBulkCopyOptions.TableLock,
this.Transaction
);
}
else
{
bulkCopy = new SqlBulkCopy
(
this.Connection.ConnectionString,
SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.UseInternalTransaction
);
}
bulkCopy.ColumnMappings.Add("FeeScheduleID", "FeeScheduleID");
bulkCopy.ColumnMappings.Add("ProcedureID", "ProcedureID");
bulkCopy.ColumnMappings.Add("AltCode", "AltCode");
bulkCopy.ColumnMappings.Add("AltDescription", "AltDescription");
bulkCopy.ColumnMappings.Add("Fee", "Fee");
bulkCopy.ColumnMappings.Add("Discount", "Discount");
bulkCopy.ColumnMappings.Add("Comment", "Comment");
bulkCopy.ColumnMappings.Add("Description", "Description");
bulkCopy.BatchSize = dataTable.Rows.Count;
bulkCopy.DestinationTableName = destinationTableName;
bulkCopy.WriteToServer(dataTable);
bulkCopy = null;
}