朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
ADO.NET DataAdapterのUpdateメソッドを使って一括更新





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
        








良いやや良い普通やや悪い悪い

投稿日時評価コメント