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
| 良い | やや良い | 普通 | やや悪い | 悪い |
|---|
| 投稿日時 | 評価 | コメント |
|---|