投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/8/23 00:11:49
> ここから、Recordsetがないのが原因では?と推測しているのですが、
> かといって、どう書き直せば良いかも分かりません。

ここ(VB中学校)のサイトには、「データベース講座」も用意されているのですが、
未完のままで、データを更新するところまでは書かれていないのですよね…。
(VB6 編の方は、レコードの修正・追加・削除まで書かれているのですけれども)


さて。データベース側に編集結果を反映させるには、
 (案1) OleDbCommand の ExecuteScalar メソッドを用いて、INSERT/DELETE/UPDATE クエリを呼び出す
 (案2) DataTable を編集後、OleDbDataAdapter.Update で反映させる。(または TableAdapter)
 (案3) Recordset を更新後、ADODB.Recordset の Update メソッドで、編集結果を反映させる。
 (案4) ADODB.Command の Execute メソッドを用いて、INSERT/DELETE/UPDATE クエリを呼び出す
 (案5) ADODB.Connection の Execute メソッドを用いて、INSERT/DELETE/UPDATE クエリを呼び出す
などの方法があります。

案1と案2 は、「ADO.NET」による一般的な手法であり、
案3~案5 は、VB6 以前や VBA で使われている「ADO」による手法です。


データベースに値を書き戻すことを考えると、ADO ベースの開発はデメリットが多いです。
ADO.NET を用いた開発手法を習得されることを、強く強くお奨めします。


というのも、System.Windows.Forms の画面部品は、ADO.NET の DataSet/DataTable との
連携を前提として設計されている部分が数多くある一方で、
ADO (ADODB) との連携については、ほとんど考慮されていないためです。


たとえば、Recordset の内容を DataGridView に直接表示させる方法さえ存在しません。

Recordset を MoveNext しながら値を読み取って、各行のデータを転記するループ処理を記述するか、
もしくは既に行われているように、OleDbDataAdapter.Fill メソッドを呼び出して、Recordset の内容を
いったん DataTable に転記しておいてから、それをバインドさせて表示するかのいずれかとなります。


またその逆に、ユーザーが編集した DataGridView あるいは DataTable の内容をデータベース側に
書き戻すための機能についても特に用意されていません。そのため、更新された DataTable の内容を
上記の案3~5 の処理に渡すための処理は、自分で個別に作りこまねばなりません。


そのため、Recordset 経由でのアクセスとなると、ADO.NET と ADO の両方の機能に
精通している必要があるという点は覚悟しておいてください。
それでも良ければお付き合いしますが、資料は少ないので、茨の道かも知れません。

VBA からの Recordset 操作であれば、それこそ 1997年ぐらいから多数執筆されていますが、
.NET からの Recordset 操作となると、詳しい資料は殆ど無いはずです。
あったとしても、OleDbDataAdapter.Fill による Recrodset からの「読み取り」ぐらいまでであり、
データ更新やストアドの呼出し手順にまで言及された資料を見た記憶がありません。


一応参考までに、DataTable の内容を Recordset に逆変換するための資料も置いておきます。
ただしこれは、データベースに書き戻すための処理では無いので、今回使うことは無さそうですが…。
https://dobon.net/vb/bbs/log3-55/32198.html



もしも ADO.NET 方針で行くのなら、まずはそちらについて学んでおいてください。

どうしても ADO を引き続き使わねばならない理由があるというのであれば、それはそれで
お付き合いいたしますが、どちらにせよ ADO.NET の知識は必要になってくるでしょう。