DataTableのデータベース保存

 DataTableクラスを利用すると、メモリ上にテーブルを作成して扱うことができます。そのテーブルに対して選択したり、更新したりすることができます。ここでは、更新したテーブル(DataTableオブジェクト)の内容をデータベースに反映させる方法を見てみましょう。

 DataTableオブジェクトとデータベースの橋渡しをするDataAdapterクラスには、Updateメソッドがあります。このメソッドの引数にDataSetオブジェクトやDataTableオブジェクトを指定します。このメソッドは変更内容に応じてDataAdapterオブジェクトにセットされているInsertCommandやUpdateCommandやDeleteCommandを呼び出します。そのため更新するためにそれぞれのCommandオブジェクトを設定しておく必要があります。

 CommandBuilderクラスを使うと、変更に応じたCommandオブジェクトを自動的に生成してくれます。このクラスと、DataAdapterクラスを組み合わせて使います。DataAdapterオブジェクトをCommandBuilderオブジェクトの管理下に置き、変更内容を自動的に検知し、更新するための準備を整えてくれます。

CommandBuilderクラスとDataAdapterクラスの関係
CommandBuilderクラスとDataAdapterクラスの関係

■ データソースごとのクラス

接続の種類 クラス名
System.Data.SqlClient SqlCommandBuilderクラス
System.Data.OracleClient OracleCommandBuilderクラス
System.Data.OleDb OleDbCommandBuilderクラス
System.Data.Odbc OdbcCommandBuilderクラス
CommandBuilderオブジェクトの種類

■ 主なプロパティ

プロパティ名 概要
DataAdapter SQL文を自動生成する対象のDataAdapterオブジェクトを取得・設定する
SqlCommandBuilderの主なプロパティ

■ 主なメソッド

メソッド名 概要
GetDeleteCommand() データベースで削除処理をするための自動生成されたSqlCommandオブジェクトを取得する
GetInsertCommand() データベースで挿入処理をするための自動生成されたSqlCommandオブジェクトを取得する
GetUpdateCommand() データベースで更新処理をするための自動生成されたSqlCommandオブジェクトを取得する
SqlCommandBuilderの主なメソッド

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 CommandBuilderTest

サンプルダウンロード

○ プログラム

 Mainメソッドを次のように記述してください。

Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Data.SqlClient;
  7. using System.Data;
  8. namespace CommandBuilderTest
  9. {
  10.  class Program
  11.  {
  12.   static void Main(string[] args)
  13.   {
  14.    //接続文字列
  15.    string constr = @"Data Source=(LocalDB)¥v11.0;AttachDbFilename=C:¥Work¥Books.mdf;Integrated Security=True;Connect Timeout=30";
  16.    //SqlConnectionオブジェクトを生成
  17.    SqlConnection con = new SqlConnection(constr);
  18.    //Usersテーブルのデータを取得するSQL文を作成
  19.    string sql = "SELECT * FROM Users;";
  20.    //SqlDataAdapterオブジェクトを生成
  21.    SqlDataAdapter da = new SqlDataAdapter(sql, con);
  22.    //SqlCommandBuilderオブジェクトを生成
  23.    SqlCommandBuilder cmdbuilder = new SqlCommandBuilder(da);
  24.    //DataTableオブジェクトを生成
  25.    DataTable dt = new DataTable();
  26.    //DataTableとデータベースに同期させる
  27.    da.Fill(dt);
  28.    //データの一覧を表示する
  29.    Console.WriteLine("次の一覧から変更するユーザーのIDを選択してください。");
  30.    foreach (DataRow dr in dt.Rows)
  31.    {
  32.     Console.WriteLine("ID:{0} {1}", dr["Id"], dr["Name"]);
  33.    }
  34.    Console.WriteLine();
  35.    //IDを入力
  36.    Console.Write("ID:");
  37.    int id = Int32.Parse(Console.ReadLine());
  38.    //新しいパスワードを入力
  39.    Console.Write("新しいパスワード:");
  40.    string password = Console.ReadLine();
  41.    //DataTableオブジェクトから入力したIDの行を取得
  42.    DataRow[] updaterow = dt.Select("Id=" + id);
  43.    //データを更新
  44.    updaterow[0]["Password"] = password;
  45.    //データベースに反映
  46.    da.Update(dt);
  47.    Console.WriteLine("変更しました。");
  48.    Console.ReadLine();
  49.   }
  50.  }
  51. }

○ 実行結果

次の一覧から変更するユーザーのIDを選択してください。
ID:1 佐藤
ID:2 鈴木
ID:3 高橋
ID:4 田中
ID:5 伊藤
ID:6 山本

ID:1
新しいパスワード:csharp
変更しました。

パスワードが変更されている
パスワードが変更されている

○ 解説

 28行目でCommandBuilderオブジェクトを生成しています。コンストラクターの引数にDataAdapterオブジェクトを指定しています。これによりDataAdapterを通して変更する内容に応じてSQL文が自動生成されるようになります。

 53行目ではDataTableオブジェクトのSelectメソッドを使って指定したIDのDataRowオブジェクトの配列を取り出しています。今回は検索結果が1件しかないので、56行目にあるようにDataRowオブジェクト配列の最初の要素のデータを変更しています。これによりDataTableオブジェクト内のデータを変更することができます。

 59行目でDataAdapterオブジェクトのUpdateメソッドを呼び出しています。引数に変更済みのDataTableオブジェクトを渡すことで、データベースに変更内容が反映されます。その際に、CommandBuilderオブジェクトが必要に応じたSQL文を生成して実行させる働きをします。

前へ   次へ