SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)byメシウス(AD)

【ComponentOne Data Services活用術】バッチ処理とEF Core連携でパフォーマンス向上

.NET対応のクラウドデータ連携ライブラリセット「ComponentOne Data Services」活用術 第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 メシウス株式会社が提供する「ComponentOne」は、.NETに対応したUIコントロールのセットです。Windows Forms、WPF、ASP.NET、ASP.NET Core、Blazor、WinUI、.NET MAUIの7つの.NETプラットフォームに対応しているのが特徴です。また、静的ファイルを含むさまざまなデータソースに接続して.NETアプリで各種のデータ操作を実行するライブラリセットとして「Data Services」エディションが提供されています。本記事では、前回に引き続きCSVファイルをComponentOne Data Servicesを使って取得、更新する事例を紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

【これまでの記事】.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メソッドを以下のリストのように追加します。

[リスト]:Program.cs
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メソッドは正しく動作しています。

図1:一括追加時のコマンドラインパラメータ(デバッグプロパティ)
図1:一括追加時のコマンドラインパラメータ(デバッグプロパティ)

一括更新(BulkUpdate)を実装してみる

 次は、一括更新のBulkUpdateメソッドです。

[リスト]:Program.cs
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メソッドは正しく動作しています。

図2:一括更新時のコマンドラインパラメータ(デバッグプロパティ)
図2:一括更新時のコマンドラインパラメータ(デバッグプロパティ)

一括削除(BulkDelete)を実装してみる

 最後は、一括削除のBulkDeleteメソッドです。

[リスト]:Program.cs
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メソッドは正しく動作しています。

図3:一括削除時のコマンドラインパラメータ(デバッグプロパティ)
図3:一括削除時のコマンドラインパラメータ(デバッグプロパティ)

次のページ
Entity Framework CoreでCRUD処理を実装

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ComponentZine(ComponentOne)byメシウス連載記事一覧
この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

提供:メシウス株式会社

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/22124 2025/10/15 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング