DataTableクラスを利用すると、メモリ上にテーブルを作成して扱うことができます。そのテーブルに対して選択したり、更新したりすることができます。ここでは、更新したテーブル(DataTableオブジェクト)の内容をデータベースに反映させる方法を見てみましょう。
DataTableオブジェクトとデータベースの橋渡しをするDataAdapterクラスには、Updateメソッドがあります。このメソッドの引数にDataSetオブジェクトやDataTableオブジェクトを指定します。このメソッドは変更内容に応じてDataAdapterオブジェクトにセットされているInsertCommandやUpdateCommandやDeleteCommandを呼び出します。そのため更新するためにそれぞれのCommandオブジェクトを設定しておく必要があります。
CommandBuilderクラスを使うと、変更に応じたCommandオブジェクトを自動的に生成してくれます。このクラスと、DataAdapterクラスを組み合わせて使います。DataAdapterオブジェクトをCommandBuilderオブジェクトの管理下に置き、変更内容を自動的に検知し、更新するための準備を整えてくれます。
接続の種類 | クラス名 |
---|---|
System.Data.SqlClient | SqlCommandBuilderクラス |
System.Data.OracleClient | OracleCommandBuilderクラス |
System.Data.OleDb | OleDbCommandBuilderクラス |
System.Data.Odbc | OdbcCommandBuilderクラス |
プロパティ名 | 概要 |
---|---|
DataAdapter | SQL文を自動生成する対象のDataAdapterオブジェクトを取得・設定する |
メソッド名 | 概要 |
---|---|
GetDeleteCommand() | データベースで削除処理をするための自動生成されたSqlCommandオブジェクトを取得する |
GetInsertCommand() | データベースで挿入処理をするための自動生成されたSqlCommandオブジェクトを取得する |
GetUpdateCommand() | データベースで更新処理をするための自動生成されたSqlCommandオブジェクトを取得する |
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 | コンソール アプリケーション |
---|---|
プロジェクト名 | CommandBuilderTest |
○ プログラム
Mainメソッドを次のように記述してください。
Program.cs
○ 実行結果
次の一覧から変更するユーザーの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文を生成して実行させる働きをします。