投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/8/2 15:07:56
ちなみに、今回は採用されなかった Delete メソッド を使ったパターンの場合はこんな感じです。

「'」を含んだデータなどでも処理できますし、SQL の構築も最小限で済むので、
基本的にはこちらの方法を推奨しておきます。


【データ取得処理】
table = New DataTable()
'DataAdapter は、実データベースと DataTable とを中継するクラスです 
adp = New MySqlDataAdapter("SELECT … FROM …", conn)
'CommandBuilder に DataAdapter を渡すと、SELECT の情報を元にして、 
'対応する INSERT/UPDATE/DELETE コマンドが自動生成されます 
Dim cb As New MySqlCommandBuilder(adp)
'DataTable にデータが取り込まれます。(全ての行が Unchanged な状態) 
adp.Fill(table)
DataGridView1.DataSource = table


この後、ユーザーが DataGridView を通じて追加・更新・削除するか、
プログラム側で .Rows.Add や Delete メソッドなどを通じて加工します。
これにより、DataTable の各行の RowState が、
Unchanged から Added/Modified/Deleted に変化します

【データ更新処理】
'DataTable の各行の Added/Modified/Deleted 状態を元に、 
'INSERT/UPDATE/DELETE コマンドに渡され、MySQL 上に一括反映されます 
adp.Update(table)
'AcceptChanges メソッドを呼び出して、更新完了を DataTable 側に反映させます。 
'これにより、すべての行が Unchanged な状態と戻ります。 
'(Added/Modified だった行は Unchanged となります) 
'(Deleted だった行は DataTable から Remove されます) 
table.AcceptChanges()



なお、外部結合したテーブルなどの場合は、MySqlCommandBuilder からでは
更新用の SQL が自動生成できませんので、自前で更新用の DELETE 文を
組まねばならないこともあります。

ただしその場合でも、先に述べた理由により、MySqlParameter を利用して
パラメーターを渡すことが望ましいです。