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