DataGridViewでDataTableのデータを表示し、データを書き換えてデータベースに更新をする時に便利なものがあります。
それは、DataAdapterのUpdateメソッドです。
Updateメソッドは引数にDataSetやDataTableを取り、DataGridViewのDataSourceにDataTableを設定していれば、DataGridView上での編集データを簡単にデータベースに反映することが出来ます。
ただ、下準備が慣れないと大変です。
4つのSQL文、SELECT、DELETE、INSERT、UPDATEの4つを用意しないといけません。
これらをDataAdapterのそれぞれのプロパティに設定します。
この時当然のことながらParameterも必要になります。
Parameterにはいくつかのバージョンのコンストラクタがありますが、パラメータ名、データ型、データサイズ、そしてカラム名を指定できるものでないといけません。
この最後のカラム名を指定することによって、どのパラメータがどのカラムに対応するかをコンピュータが自動で認識してくれます。
C#
using System.Data.OleDb; namespace ADONET_DataAdapter { public partial class Form1 : Form { //今回の主役のアダプタ OleDbDataAdapter _da = new OleDbDataAdapter(); DataTable _dt = new DataTable(); OleDbConnectionStringBuilder _connBldr = new OleDbConnectionStringBuilder(); //コネクションを使いまわすためにクラス変数にしています。 OleDbConnection _conn; //各SQL文 OleDbCommand _select = new OleDbCommand("SELECT * FROM T_1"); //SELECT文 OleDbCommand _delete = new OleDbCommand("DELETE FROM T_1 WHERE ID = ?"); //DELETE文 OleDbCommand _insert = new OleDbCommand("INSERT INTO T_1 (ID, 名前, 数量, 備考) VALUES(?, ?, ?, ?)"); //INSERT文 OleDbCommand _update = new OleDbCommand("UPDATE T_1 SET 名前 = ?, 数量 = ?, 備考 = ? WHERE ID = ?"); //UPDATE文 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //Accessファイルを使います。 _connBldr.Provider = "Microsoft.ACE.OLEDB.12.0"; _connBldr.DataSource = "G:\\TestData\\DataAdapter.accdb"; _conn = new OleDbConnection(_connBldr.ConnectionString); _select.Connection = _conn; _delete.Connection = _conn; _insert.Connection = _conn; _update.Connection = _conn; //DataAdapterがどのパラメータがどのカラムのデータとなるかわかるように、カラム名も指定します。 OleDbParameter del = new OleDbParameter("p1", OleDbType.Integer, 0, "ID"); _delete.Parameters.Add(del); OleDbParameter ins1 = new OleDbParameter("p1", OleDbType.Integer, 0, "ID"); OleDbParameter ins2 = new OleDbParameter("p2", OleDbType.VarWChar, 0, "名前"); OleDbParameter ins3 = new OleDbParameter("p3", OleDbType.Integer, 0, "数量"); OleDbParameter ins4 = new OleDbParameter("p4", OleDbType.VarWChar, 0, "備考"); _insert.Parameters.Add(ins1); _insert.Parameters.Add(ins2); _insert.Parameters.Add(ins3); _insert.Parameters.Add(ins4); OleDbParameter upd1 = new OleDbParameter("p1", OleDbType.VarWChar, 0, "名前"); OleDbParameter upd2 = new OleDbParameter("p2", OleDbType.Integer, 0, "数量"); OleDbParameter upd3 = new OleDbParameter("p3", OleDbType.VarWChar, 0, "備考"); OleDbParameter upd4 = new OleDbParameter("p4", OleDbType.VarWChar, 0, "ID"); _update.Parameters.Add(upd1); _update.Parameters.Add(upd2); _update.Parameters.Add(upd3); _update.Parameters.Add(upd4); //各コマンドをデータアダプタのそれぞれのコマンドに代入 _da.SelectCommand = _select; _da.DeleteCommand = _delete; _da.InsertCommand = _insert; _da.UpdateCommand = _update; //エラーが起きてもロールバックせずに他のは実行させる。行ごとのエラーを見るためです。 _da.ContinueUpdateOnError = true; _da.Fill(_dt); dataGridView1.DataSource = _dt; } //更新ボタンをクリックしたら変更箇所を全部更新させる。 private void btnUpdate_Click(object sender, EventArgs e) { _da.Update(_dt); } //各行の更新エラーをラベルに表示するメソッド private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { label1.Text = dataGridView1.Rows[e.RowIndex].ErrorText; } } }
VB.NET
Imports System.Data.OleDb Public Class Form1 '今回の主役のアダプタ Dim _da As OleDbDataAdapter = New OleDbDataAdapter() Dim _dt As DataTable = New DataTable() Dim _connBldr As OleDbConnectionStringBuilder = New OleDbConnectionStringBuilder() 'コネクションを使いまわすためにクラス変数にしています。 Dim _conn As OleDbConnection '各SQL文 Dim _select As OleDbCommand = New OleDbCommand("SELECT * FROM T_1") ' SELECT文 Dim _delete As OleDbCommand = New OleDbCommand("DELETE FROM T_1 WHERE ID = ?") ' DELETE文 Dim _insert As OleDbCommand = New OleDbCommand("INSERT INTO T_1 (ID, 名前, 数量, 備考) VALUES(?, ?, ?, ?)") ' INSERT文 Dim _update As OleDbCommand = New OleDbCommand("UPDATE T_1 SET 名前 = ?, 数量 = ?, 備考 = ? WHERE ID = ?") ' UPDATE文 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Accessファイルを使います。 _connBldr.Provider = "Microsoft.ACE.OLEDB.12.0" _connBldr.DataSource = "G:\TestData\DataAdapter.accdb" _conn = New OleDbConnection(_connBldr.ConnectionString) _select.Connection = _conn _delete.Connection = _conn _insert.Connection = _conn _update.Connection = _conn 'DataAdapterがどのパラメータがどのカラムのデータとなるかわかるように、カラム名も指定します。 Dim del As OleDbParameter = New OleDbParameter("p1", OleDbType.Integer, 0, "ID") _delete.Parameters.Add(del) Dim ins1 As OleDbParameter = New OleDbParameter("p1", OleDbType.Integer, 0, "ID") Dim ins2 As OleDbParameter = New OleDbParameter("p2", OleDbType.VarWChar, 0, "名前") Dim ins3 As OleDbParameter = New OleDbParameter("p3", OleDbType.Integer, 0, "数量") Dim ins4 As OleDbParameter = New OleDbParameter("p4", OleDbType.VarWChar, 0, "備考") _insert.Parameters.Add(ins1) _insert.Parameters.Add(ins2) _insert.Parameters.Add(ins3) _insert.Parameters.Add(ins4) Dim upd1 As OleDbParameter = New OleDbParameter("p1", OleDbType.VarWChar, 0, "名前") Dim upd2 As OleDbParameter = New OleDbParameter("p2", OleDbType.Integer, 0, "数量") Dim upd3 As OleDbParameter = New OleDbParameter("p3", OleDbType.VarWChar, 0, "備考") Dim upd4 As OleDbParameter = New OleDbParameter("p4", OleDbType.VarWChar, 0, "ID") _update.Parameters.Add(upd1) _update.Parameters.Add(upd2) _update.Parameters.Add(upd3) _update.Parameters.Add(upd4) '各コマンドをデータアダプタのそれぞれのコマンドに代入 _da.SelectCommand = _select _da.DeleteCommand = _delete _da.InsertCommand = _insert _da.UpdateCommand = _update 'エラーが起きてもロールバックせずに他のは実行させる。行ごとのエラーを見るためです。 _da.ContinueUpdateOnError = True _da.Fill(_dt) DataGridView1.DataSource = _dt End Sub '更新ボタンをクリックしたら変更箇所を全部更新させる。 Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click _da.Update(_dt) End Sub '各行の更新エラーをラベルに表示するメソッド Private Sub DataGridView1_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.RowHeaderMouseClick Label1.Text = DataGridView1.Rows(e.RowIndex).ErrorText End Sub End Class
良い | やや良い | 普通 | やや悪い | 悪い |
---|
投稿日時 | 評価 | コメント |
---|