投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/8/27 11:28:56
> 具体例が欲しければ、サンプルを書いても良いですが、そもそも開発環境は何でしょうか?

どのライブラリで接続すべきかは、使用する開発環境によって変わりますので、
次回以降の質問では、VB のバージョン等も明示して頂けると助かります。
そうすれば、具体的なコード例を提示しやすいです。

先の回答で、
> > > VBA や VB6 ではなく、.NET 版の方でしょうか。
という断り書きを入れておいたのもそれが理由です。


いずれにせよ、google などで
「VB mdb rollback」
などのキーワードで検索すれば、具体的なサンプルが幾つか見つかるでしょう。

たとえば VB.NET 向けなら
https://jehupc.exblog.jp/9216997/
http://www.asahi-net.or.jp/~ef2o-inue/vbnet/sub13_02_040.html
とか、VBA 向けなら
https://kosapi.com/post-3862/
http://www.k1simplify.com/vba/practical/database06.html
http://www7b.biglobe.ne.jp/~cbcnet/DAO/record5.html
とか。他にも色々。


ロールバックは、更新がエラーで失敗した時だけではなく、たとえば
  3 行更新しようとしたが、2 行しか更新されなかった。
  ⇒特にエラーが出たわけではなく、処理自体は成功している。
  ⇒他のユーザーが 1 行書き換えていたので、ヒットしなかったようだ。
  ⇒同時更新による不整合が出ないよう、更新された 2 行もロールバックして、元の状態に戻そう。
のような状況でも必要となりますね。


> > ロールバックは
> > ADODB かDAOかSystem.Data.OleDbを使用しないといけ
> > ないわけですね
>

そういう書き方をするということは、
それぞれの違いまでは、恐らくご存知ないのだと推察しました。


ひとまず、それぞれの違いをざっくり説明しておくと:


🔷『System.Data.OleDb』は、「ADO.NET」と呼ばれる .NET ライブラリの一つです。
その名の通り、.NET 専用のライブラリだと思ってください。

VB.NET からデータベースの読み書きを行うのであれば、ADO.NET の習得はほぼ必須です。

先に紹介した連載記事は System.Data.SqlClient という、SQL Server 向けの記事ですが、
扱うデータベースと接続情報が異なるだけで、ADO.NET としての基本的な考え方は
ほぼそのまま応用できますし、連載の最後に、トランザクション処理への言及もあります。

Visual Basic 中学校のデータベース講座は、対 mdb 向けなので良いかと思ったのですが、
こちらはトランザクション処理に入る前に連載が中断されてしまいました…。



※ADO.NET には、SQL Server 用の「System.Data.SqlClient」など、
 データベースごとに異なる幾つかのライブラリがあります。

.NET ではない Visual Basic の場合は ADO.NET を使用できません。
.NET な Visual Basic の場合は通常、ADO.NET を使うようにします。

VB.NET から mdb にアクセスするなら、ほぼコレ一択なのですが、
これでできるのは単純なデータの読み書きなど、基本的な機能に限定されています。

mdb ファイルの最適化や照合順序の変更といった固有機能は
ADO.NET からでは呼び出せないため、そうした機能を利用したい場合には、
ADO.NET と併せて、DAO が併用されることがあります。


🔶『ADODB』は、「ADO」と呼ばれる COM ライブラリの一つです。
名前から想像できるかと思いますが、ADO.NET の前身にあたります。
※ ADO = ActiveX Data Objects

これは .NET が登場する前に使われていた AcitiveX 系のライブラリであり、
VB6 / VBA で開発する場合は、これがよく利用されます。

一方、ADO を VB.NET から利用することは稀です(通常は ADO.NET を使います)。

先日の回答で述べた通り、System.Data.OleDb.OleDbDataAdapter を使えば、
ADO で読み取ったデータを、.NET の DataTable へ変換することが
できるのですが、その逆に、DataTable の内容を読み取って
データベースに書き戻す機能は存在しないためです。

DataTable を一切使わずに操作するのであれば良いですが、その場合、
VB.NET で使えるデータバインド等の便利機能も使えない事になりますので、
どうしても実装コストが高くなりがちです。

また、VB.NET からの AcitiveX(COM) オブジェクトの呼び出しはボトルネックに
なりえますし、オブジェクト解放の手間も増えてしまうのもデメリットです。

ちなみに mdb ファイルの最適化や照合順序の変更といった機能が必要な場合、
ADO の一種である『ADOX』という拡張ライブラリが必要になります。
※ ADOX = ActiveX Data Objects Extensions for Data Definition Language and Security


◆『DAO』およびその後継の『ACEDAO』も、COM ライブラリです。
Microsoft Access に組み込まれている VBA (Visual Basic for Applications) から
呼び出す場合においては、最良の選択肢の一つです。

単純に mdb の読み書き速度という観点だけで見た場合、
Access VBA から DAO / ACEDAO を使うのが最速と言えます。

しかし DAO は、ADO 同様の理由から、VB.NET との相性があまり良くありません。
.NET からだとオブジェクトの解放処理の手間が煩雑になります。

しかも ADODB で使えていた DataTable への変換機能も使えないため、
ADODB 以上に実装コストが高くなります。


ただ、ADO / ADO.NET では直接利用することができず、
DAO / ACEDAO からでないと呼び出せない機能もいくつかあります。
そういった特別な場合には、必よVB.NET からこれを利用することもあります。
(動的プロパティ、ANSI-89 モード、添付ファイル型フィールドなど)