私は.NET 3.5でカスタマイズされたデータインポート実行可能ファイルを持っています.SqlBulkCopyは基本的に大量のデータをより高速に挿入します。このアプリは基本的に、入力ファイルを取得し、データを処理して SQL Server 2000 に一括アップロードします。このアプリは、SQL 2008 データベース環境でアプリを構築していたコンサルタントによって作成されました。そのenvの違いがこれを引き起こしているでしょうか?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;
}