У меня есть настраиваемый исполняемый файл импорта данных в .NET 3.5, который SqlBulkCopy позволяет в основном быстрее вставлять большие объемы данных. Приложение в основном берет входной файл, массирует данные и массово загружает их в SQL Server 2000. Он был написан консультантом, который создавал его в среде базы данных SQL 2008. Будет ли эта разница env причиной этого? В SQL 2000 есть утилита bcp, на которой базируется BulkCopy. Итак, когда мы запустили это, это вызвало ошибку тупика.
Сведения об ошибке: Транзакция (идентификатор процесса 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;
}