ここのサンプルでは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
| 良い | やや良い | 普通 | やや悪い | 悪い |
|---|
| 投稿日時 | 評価 | コメント |
|---|