私はSqlBulkCopyを使用してCSVから約66k行をインポートしています。 CSVはDataTableにインポートされ、以下の以下のメソッドに渡されます。SqlBulkCopyはDataTableより多くの行を作成します
データベースに無期限に同じ行をレプリケートする(または終わりに達するとリセットする)ようです。デバッグは約30分間実行され、DataTableの各行を約5回複製する350kレコードに近いものを作成しました。
私はDataTableの行の量が正しいことを確認できますので、私は何か、何らかのアイデアが欠落している必要がありますか?
注:私はs.BatchSizeを追加しました。これは、大文字小文字ではない量だけをインポートすることを希望しています。
/*
* StoreImportedData()
* This method will store all of the imported data from the datatable to the SQL server database.
*
*
*/
private Boolean StoreImportedData(DataTable csvFileData)
{
try
{
using (SqlConnection dbConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
dbConnection.Open();
using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
{
s.DestinationTableName = "Staging";
// Amount of rows to issue in the batch: (currently value is around 60k)
s.BatchSize = csvFileData.Rows.Count;
s.ColumnMappings.Add("remark", "ReportDate");
s.ColumnMappings.Add("ipAddress", "IPAddress");
s.ColumnMappings.Add("hostName", "HostName");
s.ColumnMappings.Add("macAddress", "MacAddress");
s.ColumnMappings.Add("deviceName", "PrinterName");
s.ColumnMappings.Add("comment", "CenterCode");
s.ColumnMappings.Add("userName", "CustomerCode");
s.ColumnMappings.Add("userDisplayName", "CustomerName");
s.ColumnMappings.Add("printerBlackTotal", "TPrintBw");
s.ColumnMappings.Add("printerColorTotal", "TPrintCol");
s.ColumnMappings.Add("copyBlackTotal", "TCopyBw");
s.ColumnMappings.Add("copyColorTotal", "TCopyCol");
s.ColumnMappings.Add("scanTotal", "TScan");
s.ColumnMappings.Add("faxBlackTotal", "TFaxBw");
s.WriteToServer(csvFileData);
}
}
}
catch (Exception e)
{
throw new Exception("An error has occured with the import SQL operation: " + e.Message);
}
return true;
}
}
あなたがステージングテーブルに一意のインデックスまたは主キーを持っていますか? –
はい自動増分するプライマリ・キー(Id)があります – mauzilla
複数の挿入を防ぐために一意の索引を表に追加するのが私の推測ですが、自動増分である主キーはそれを助けません。 –