基本的に、大量のデータを Excel ファイルに挿入する必要があります。OleDB 接続を作成するのが最速の方法のようですが、メモリの問題が発生したことがわかりました。INSERT クエリを実行すると、プロセスで使用されるメモリが増加し続けるようです。Excelファイルに出力するときにのみ発生するように絞り込みました(Excelへの出力がなくてもメモリは安定しています)。各ワークシート間の接続を閉じて再度開きますが、これはメモリ使用量に影響を与えないようです (Dispose() と同様)。比較的小さなデータセットで確認できるように、データは正常に書き込まれています。誰かが洞察力を持っているなら、それはありがたいです。
initializeADOConn()はコンストラクターで呼び出されます
initADOConnInsertComm()は、挿入パラメータ化された挿入クエリを作成します
writeRecord()は、新しいレコードが書き込まれるたびに呼び出されます。必要に応じて新しいワークシートが作成されます。
public bool initializeADOConn()
{
/* Set up the connection string and connect.*/
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + this.destination + ";Extended Properties=\"Excel 8.0;HDR=YES;\"";
//DbProviderFactory factory =
//DbProviderFactories.GetFactory("System.Data.OleDb");
conn = new OleDbConnection(connectionString);
conn.ConnectionString = connectionString;
conn.Open();
/* Intialize the insert command. */
initADOConnInsertComm();
return true;
}
public override bool writeRecord(FileListerFileInfo file)
{
/* If all available sheets are full, make a new one. */
if (numWritten % EXCEL_MAX_ROWS == 0)
{
conn.Close();
conn.Open();
createNextSheet();
}
/* Count this record as written. */
numWritten++;
/* Get all of the properties of the FileListerFileInfo record and add
* them to the parameters of the insert query. */
PropertyInfo[] properties = typeof(FileListerFileInfo).GetProperties();
for (int i = 0; i < insertComm.Parameters.Count; i++)
insertComm.Parameters[i].Value = properties[i].GetValue(file, null);
/* Add the record. */
insertComm.ExecuteNonQuery();
return true;
}
編集:
いいえ、エクセルは全く使いません。私は意図的に Interop.Excel を避けています。パフォーマンスが悪いためです (少なくとも、私が手を出していたからです)。