投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/8/27 11:00:28
> 例えばDAOを利用したSQLでMDBを検索
> 更新したプログラムのHP、どこかに無いでしょうか?

幾つかありますよ。たとえば Access のヘルプにも記載がありますが、
それがCOBOLプログラマさんの求める物かは分かりません。

具体例が欲しければ、サンプルを書いても良いですが、そもそも開発環境は何でしょうか?
それによってもしかしたら、DAO を使うことが正しい選択ではない可能性もあります。



> <初心者です>先輩はまた違う訳ですね
ん? どういう意味でしょうか。

初心者ですさんの投稿は、このあたりでしたね。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30486
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30486


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

そうですね。通常は先の回答のメソッドを使うのが一般的です。

ただ、他の選択肢もあります。SQL ステートメント(ANSI-92 モード)としての
トランザクション構文もあるので、メソッドの代わりに SQL からの指定も一応可能です。
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/transaction-statement-microsoft-access-sql


トランザクションの指定が無かった場合は、自動コミットモードとなります。
正常時には即時反映され、失敗時にはロールバックされる状態ですね。
★この状態を、暗黙のトランザクション(implicit transaction) と言います。

ただ即時反映とはいいつつも、キャッシュの都合上、ファイルへの書き込みは
非同期的に行われる点に注意が必要です。実際にファイルに書き込まれるまでには、
最大で500ミリ秒の書き込み遅延が発生します。(レジストリ設定で変更可能)

暗黙のトランザクションで実装した場合、マルチユーザー環境においては、
新たに追加したレコードが、キャッシュがフラッシュされるまでの間、
他のユーザーから見えない状態になるなど、望ましくない結果を生んでしまいます。


そのため通常は、明示的に BeginTrans / Commit(CommitTrans) を呼んで
トランザクション範囲を明示するようにするのが安全です。マルチユーザーの場合はほぼ必須。

この場合、コミット時のファイルへの反映が同期的となり、上記の遅延問題が生じなくなります。
☆この状態を、明示的トランザクション(explicit transaction) と言います。

明示的トランザクションの場合、Commit(CommitTrans) メソッドを呼びだすまでは
ファイルへの書き込みは保留された状態となります。

実行時エラーになった場合には、もちろん処理結果は反映されません。
編集を諦めてそのままデータベースとの接続を閉じてしまっても良いですし、
あるいはロールバックして、正しい値で処理をやり直してみるのも良いでしょう。