メモリの問題により、DataTable を IDataReader に置き換える/変換することにしました。
かなりの時間 Google と MSDN で検索した後、http://www.michaelbowersox.com/2011/12/22/using-a-custom-idatareader-to-stream-data-into-a-databaseでこれを見つけました。 /およびSql Serverの何百万ものレコードを一括挿入します。
私はLumenWorks Fast CSV Readerを使用しているため、CsvReaderにIDataReaderに2つの異なるフィールドバージョンを使用させる方法をまだ理解していません。:-( csvReader.FieldCount がここで重要ですが、IDataReader インターフェイスを持つ 2 つの新しいクラスのいずれかを使用するように CsvReader に指示する方法がわかりません。以下の元のスクリプトと変更されたスクリプトを参照してください...ありがとう...
//元のスクリプト...
var dbConnection = new SqlConnection(_dbConnectionString);
using (var dbBulkCopy = new SqlBulkCopy(dbConnection)
{
using (CsvReader csvReader = new CsvReader(new StreamReader(filePath), false, '|', '"', '\\', '#', ValueTrimmingOptions.UnquoteOnly))
{
while(csvReader.ReadNextRecord())
{
if (csvReader.FieldCount == 48)
{
//Version 1...
dataRow["DealerId"] = csvReader[0];
dataRow["DealerName"] = csvReader[1];
//Etc...
}
else if (csvReader.FieldCount == 51)
{
//Version 2...
dataRow["DealerId"] = csvReader[0];
dataRow["DealerName"] = csvReader[1];
//Etc...
}
else { throw new Exception("Field Total Count Mismatched"); }
dataTable.Rows.Add(dataRow);
}
dbConnection.Open();
dbBulkCopy.WriteToServer(dataTable);
}
}
// 新しいスクリプト...
var dbConnection = new SqlConnection(_dbConnectionString);
using (var dbBulkCopy = new SqlBulkCopy(dbConnection)
{
dbConnection.Open();
using (CsvReader csvReader = new CsvReader(new StreamReader(filePath), false, '|', '"', '\\', '#', ValueTrimmingOptions.UnquoteOnly))
{
csvReader.ReadNextRecord();
dbBulkCopy.WriteToServer(
if (csvReader.FieldCount == 48)
{
//Version 1...
csvReader....??? //Assign a custom class having IDataTable...
}
else if (csvReader.FieldCount == 51)
{
//Version 2...
csvReader....??? //Assign a custom class having IDataTable...
}
else { throw new Exception("Field Total Count Mismatched"); }
);
}
}
//サンプルスクリプト...
using (var file = new StreamReader(path))
using (var csv = new CsvReader(file, true)) // true = has header row
using (var bcp = new SqlBulkCopy(connection)) {
bcp.DestinationTableName = "TableName";
bcp.WriteToServer(csv);
}