朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
ADO.NET SELECT文から更新系SQLを取得してDataGridViewの更新処理をワンクリックでする





ここのサンプルではSQL Serverを使っていますが、OracleやAccessでも同じようにできるはずです。
エラーを出さずにする為には、対象のデータベースのテーブルに主キーを設定してないとダメです。
ここで注意が必要なのは、クラスメンバーにしておく、データアダプタとデータテーブル、コネクションです。
この3つは一貫して保持してないといけません。
また、更新系のSQL文を自動作成するためのコマンドビルダを使っていますが、最初に述べたようにSELECT文のテーブルに主キーが無いとエラーになります。
DataGridViewでユーザが更新したデータをデータベースに反映するには、データアダプタのUpdateメソッドだけで行けるのですが、ここでコネクションが先に設定されていない、もしくは設定したコネクションが消えているとエラーになります。

C#

    public partial class Form1 : Form
    {
        //データアダプタとデータテーブル、コネクションは終了まで保持できるようにクラスメンバーにしてます。
        private SqlDataAdapter _da = new SqlDataAdapter();
        private DataTable _dt = new DataTable();
        private SqlConnection _conn = null;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //SELECT文では取得するカラムには、必ず主キーを含めてください。
            //またデータベース側のテーブルに主キーが無いと更新系SQLを取得する時にエラーになります。
            string strSelect = "SELECT * FROM [dbo].[TBL_Person] ORDER BY ID";
            SqlConnectionStringBuilder connBldr = new SqlConnectionStringBuilder();
            connBldr.DataSource = ".\\SQLExpress";
            connBldr.InitialCatalog = "SampleTestDB";
            connBldr.IntegratedSecurity = true;
            _conn = new SqlConnection(connBldr.ConnectionString);
            
            using (SqlCommand cmd = new SqlCommand(strSelect, _conn))
            {
                this._da.SelectCommand = cmd;
                    
                this._da.Fill(this._dt);
                dataGridView1.DataSource = this._dt;
                //ここで更新系SQLの取得します。
                //データアダプタを渡すと、データアダプタに設定されたSELECコマンドから作成されます。
                SqlCommandBuilder builder = new SqlCommandBuilder(this._da);
                this._da.DeleteCommand = builder.GetDeleteCommand();
                this._da.InsertCommand = builder.GetInsertCommand();
                this._da.UpdateCommand = builder.GetUpdateCommand();
            }
            //ここでは、あるSQL文でエラーが起きても次のSQL文を実行するように設定していますが、特に意味はないです。
            this._da.ContinueUpdateOnError = true;
        }
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            //これだけで、DataGridViewで更新されたレコードが全部更新されます。
            this._da.Update(this._dt);
        }
    }

        

VB.NET

Imports System.Data.SqlClient
Public Class Form1
    'データアダプタとデータテーブル、コネクションは終了まで保持できるようにクラスメンバーにしてます。
    Private _da As New SqlDataAdapter
    Private _dt As New DataTable
    Private _conn As SqlConnection

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'SELECT文では取得するカラムには、必ず主キーを含めてください。
        'またデータベース側のテーブルに主キーが無いと更新系SQLを取得する時にエラーになります。
        Dim strSelect As String = "SELECT * FROM [dbo].[TBL_Person] ORDER BY ID"
        Dim connBldr As New SqlConnectionStringBuilder
        connBldr.DataSource = ".\SQLExpress"
        connBldr.InitialCatalog = "SampleTestDB"
        connBldr.IntegratedSecurity = True
        _conn = New SqlConnection(connBldr.ConnectionString)
        Using cmd As SqlCommand = New SqlCommand(strSelect, _conn)
            Me._da.SelectCommand = cmd
            Me._da.Fill(Me._dt)
            DataGridView1.DataSource = Me._dt
            'ここで更新系SQLの取得します。
            'データアダプタを渡すと、データアダプタに設定されたSELECコマンドから作成されます。
            Dim builder As SqlCommandBuilder = New SqlCommandBuilder(Me._da)
            Me._da.DeleteCommand = builder.GetDeleteCommand()
            Me._da.InsertCommand = builder.GetInsertCommand()
            Me._da.UpdateCommand = builder.GetUpdateCommand()
            'ここでは、あるSQL文でエラーが起きても次のSQL文を実行するように設定していますが、特に意味はないです。
            Me._da.ContinueUpdateOnError = True
        End Using
    End Sub
    Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
        Me.Close()
    End Sub
    Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
        'これだけで、DataGridViewで更新されたレコードが全部更新されます。
        Me._da.Update(Me._dt)
    End Sub
End Class

        








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

投稿日時評価コメント