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メソッドを次のように記述してください。

Module1.vb

  1. Imports System.Data.SqlClient
  2. Module Module1
  3.  Sub Main()
  4.   '接続文字列
  5.   Dim constr As String = "Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Work\Books.mdf;Integrated Security=True;Connect Timeout=30"
  6.   'SqlConnectionオブジェクトを生成
  7.   Dim con As New SqlConnection(constr)
  8.   'Usersテーブルのデータを取得するSQL文を作成
  9.   Dim sql As String = "SELECT * FROM Users;"
  10.   'SqlDataAdapterオブジェクトを生成
  11.   Dim da As New SqlDataAdapter(sql, con)
  12.   'SqlCommandBuilderオブジェクトを生成
  13.   Dim cmdbuilder As New SqlCommandBuilder(da)
  14.   'DataTableオブジェクトを生成
  15.   Dim dt As New DataTable()
  16.   'DataTableとデータベースに同期させる
  17.   da.Fill(dt)
  18.   'データの一覧を表示する
  19.   Console.WriteLine("次の一覧から変更するユーザーのIDを選択してください。")
  20.   For Each dr As DataRow In dt.Rows
  21.    Console.WriteLine("ID:{0} {1}", dr("Id"), dr("Name"))
  22.   Next
  23.   Console.WriteLine()
  24.   'IDを入力
  25.   Console.Write("ID:")
  26.   Dim id As Integer = Int32.Parse(Console.ReadLine())
  27.   '新しいパスワードを入力
  28.   Console.Write("新しいパスワード:")
  29.   Dim password As String = Console.ReadLine()
  30.   'DataTableオブジェクトから入力したIDの行を取得
  31.   Dim updaterow As DataRow() = dt.Select("Id=" & id)
  32.   'データを更新
  33.   updaterow(0)("Password") = password
  34.   'データベースに反映
  35.   da.Update(dt)
  36.    Console.WriteLine("変更しました。")
  37.    Console.ReadLine()
  38.  End Sub
  39. End Module

○ 実行結果

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

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

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

○ 解説

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

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

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

前へ   次へ