【これまでの記事】.NET対応のクラウドデータ連携ライブラリセット「ComponentOne Data Services」活用術
必要な環境
本記事のサンプルコードは、以下の環境で動作を確認しています。
- Windows 11 Pro(23H2)
- ComponentOne Enterprise 2025J v1
- .NET SDK(9.0.302)
- Visual Studio 2022(17.14.10)
対象読者
- さまざまな種類のデータと簡単に連携したい方
- フォームやで高機能なコントロールを利用したい方
- デスクトップアプリ開発、バックエンド開発が得意な方
一括処理の実装
今回は、第2回で扱ったサンプルCSVConnectorConsoleAppに一括処理(バッチ処理)を導入します。一括処理によって、CSVファイルへの変更をバッファリングし、大量の変更がある場合のパフォーマンスを向上させることができます。第2回のサンプルに一括処理のメソッドを追加していくことで対応していきます。新しいアプリのコマンドライン書式は以下の通りとします。
program [ [C|R|U|D|BC|BU|BD] パラメータ]
新規のパラメータとして、BC(一括追加)、BU(一括更新)、BD(一括削除)のいずれかを指定します。パラメータには、それぞれに必要なデータを記述します。
- BCまたはbc:新規データをCSV形式で格納したファイル名(No列は自動決定されるので省略可)
- BUまたはbu:更新対象行のNoをカンマ区切りで指定(一致する行の全ての列が「削除」に置き換えられる)
- BDまたはbd:削除対象行のNoをカンマ区切りで指定
仕分け部分のコードは本記事の主旨とは関係が薄いので、掲載を割愛します。内容は配布サンプルを参照してください。
[NOTE]DetectionSchemeへの変更
2025Jにおいて、CSVファイルのスキーム解析を指示するパラメータが、DetectionSchemeTypeからDetectionSchemeに変更されました。よって本サンプルも接続文字列を変更しています。掲載は省くので、内容は配布サンプルを参照してください。
一括追加(BulkCreate)を実装してみる
まずは一括追加です。一括処理の恩恵を感じやすいとしたら、まずはこの追加でしょう。BulkCreateメソッドを以下のリストのように追加します。
void BulkCreate(C1CSVConnection conn, string filename) { // 追加時のレコード番号を取得する var no = GetNextNo(conn); (1) // 全レコードのDataTableを取得する var adapter = new C1CSVDataAdapter(conn, "SELECT * FROM customer"); var dataTable = new DataTable(); adapter.Fill(dataTable); // SQLのINSERTコマンドを生成する adapter.InsertCommand = new C1CSVCommand(conn); (2) adapter.InsertCommand.CommandText = "INSERT INTO customer([No],[氏名],[氏名(ひらがな)],[メールアドレス],[電話番号],[郵便番号],[住所],[会社名]) VALUES(@No,@Name,@Kana,@Email,@Tel,@Zip,@Address,@Company)"; …略… // 入力ファイルから1行ずつ読み込んでDataTableに追加する // countは追加行数を数える変数 var count = 0; (3) using (var reader = new StreamReader(filename)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(','); // DataTableに新規の行を追加して各列の値をセットする var customerRow = dataTable.NewRow(); customerRow["No"] = (no++).ToString(); customerRow["氏名"] = values[1]; customerRow["氏名(ひらがな)"] = values[2]; customerRow["メールアドレス"] = values[3]; customerRow["電話番号"] = values[4]; customerRow["郵便番号"] = values[5]; customerRow["住所"] = values[6]; customerRow["会社名"] = values[7]; dataTable.Rows.Add(customerRow); count++; } } if (count > 0) (4) { // 書き込みサイズをUpdateBatchSizeプロパティでセットする adapter.UpdateBatchSize = count; // 書き込みを実行する。書き込み行数がマイナスならエラー if (adapter.Update(dataTable) < 0) { Console.WriteLine("一括作成でエラーが発生しました。"); } } }
(1)のレコード番号を求める処理とデータテーブルの取得の処理、(2)のINSERTコマンドの作成については、既存のcreateメソッドと同じです。No列は、既存のレコードの最大値に+1したもの以降に置き換えられます。
(3)で、CSVファイルから1行ずつ読み込み、DataTableに新規行を追加していきます。このあたりもinsertメソッドと同様ですが、一括処理するためにDataAdapterのUpdateメソッドを毎回呼び出さない点が異なります。
(4)は、追加した行がある場合の処理です。一括追加では、以下の点が単一行の追加と異なります。
- DataAdapterのUpdateBatchSizeプロパティに、一括処理の行数(この場合は追加行数)を指定する。このサイズ単位でCSVファイルに書き込みを実行する
- DataAdapterのUpdateメソッドをここで呼び出す。CSVファイルに書き込みを実行する
これは一括更新や一括削除でも同じなので、覚えておきましょう。CSVファイルcustomer.csvとcustomer_new.csvを、あらかじめ実行ファイルと同じ場所(bin\Debug\net9.0など)に配置後にアプリをビルドします。コマンドラインパラメータを図1のように指定して実行し、CSVファイルを確認するか全データを出力してください。新しい行が追加されていればBulkCreateメソッドは正しく動作しています。

一括更新(BulkUpdate)を実装してみる
次は、一括更新のBulkUpdateメソッドです。
void BulkUpdate(C1CSVConnection conn, string nos) { // 指定されたレコードのみのDataTableを取得する var adapter = new C1CSVDataAdapter(conn, $"SELECT * FROM customer WHERE [No] IN ({nos})"); (1) …略… // DataTableの全行を更新する // countは更新行数を数える変数 var count = 0; (2) for (int i = 0; i < dataTable.Rows.Count; i++) { // DataTableの各行で各列の値をセットする var customerRow = dataTable.Rows[i]; customerRow["氏名"] = "削除"; customerRow["氏名(ひらがな)"] = "削除"; customerRow["メールアドレス"] = "削除"; customerRow["電話番号"] = "削除"; customerRow["郵便番号"] = "削除"; customerRow["住所"] = "削除"; customerRow["会社名"] = "削除"; count++; } …略… }
一括更新におけるポイントは、(1)のようにSQL文を構成して、DataTableには更新対象の行だけを読み込んでおくことです。そして、(2)のようにDataTableの各行について列の更新を実行します。UpdateBatchSizeプロパティの設定、Updateメソッドの実行も同様です。
コマンドラインパラメータを図2のように指定して実行し、CSVファイルを確認するか全データを出力してください。指定した行の全列が「削除」になっていればBulkUpdateメソッドは正しく動作しています。

一括削除(BulkDelete)を実装してみる
最後は、一括削除のBulkDeleteメソッドです。
void BulkDelete(C1CSVConnection conn, string nos) { // 指定されたレコードのみのDataTableを取得する var adapter = new C1CSVDataAdapter(conn, $"SELECT * FROM customer WHERE [No] IN ({nos})"); …略… // DataTableの全行を更新する // countは削除行数を数える変数 var count = 0; (1) for (int i = 0; i < dataTable.Rows.Count; i++) { // DataTableの各行で削除を実行する var customerRow = dataTable.Rows[i]; customerRow.Delete(); count++; } …略… }
ポイントは、一括更新とほぼ同様で、読み込んだDataTableの各行に対してDeleteメソッドを実行するだけです(「dataTable.Rows[i].Delete();」としても同様)。UpdateBatchSizeプロパティの設定、Updateメソッドの実行も同様です。
コマンドラインパラメータを図3のように指定して実行し、CSVファイルを確認するか全データを出力してください。指定した行が存在しなければ、BulkDeleteメソッドは正しく動作しています。
