- ベストアンサー
Accessdでの「トランザクションが多すぎる」エラーとは何?
- Access98のVBAでプログラムを組み、RecordsetをUpdateしたり、Deleteしたりしていると、『実行時エラー'3003':ネストしているトランザクションが多すぎるため、トランザクションを開始できませんでした』とエラーが発生します。
- 「トランザクション」の意味が分かりませんが、プログラムの中では、「トランザクション」なるモノを定義や設定したりしておりません。
- エラーが発生しないようにするためには、プログラムの中にどの様なエラー回避の語を書き込んで置けば良いのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>RecordsetのrsをPublic rs As Recordset宣言して コレがまずいかも… レコードセットは出来るだけローカルで宣言しましょう。 >Closeすることで完結するのですか? OpenRecordSetで生成されてから、 .Closeするか、その変数(インスタンス)が破棄されるまで、レコードセットは有効です。 Updateは、単にDBにデータを格納するだけの操作です。 DBプログラミングの世界では、一つのレコードセット/カーソルを開きっぱなしにして、Closeもせずに何度も使いまわしにすることは、「やってはいけないこと」の一つだとされています。 上記は、仮にソフトが完璧であれば、別にやっても構わないんことなんですが、DBの方では「積もり積もったら悪影響が出る」系のバグを誘発しますし、アプリケーション側では、「今、どのレコードセットが開いてる/閉じてるのかを(プログラマが)思い違える」系のバグを埋め込みやすくなります。 今回のエラーの原因がそこにあるのかどうかは分からないんですが、トランザクションを使っていないのに、お書きになったエラーが発生するとしたら、まず疑うのはCloseのし忘れでしょう。
その他の回答 (1)
- ARC
- ベストアンサー率46% (643/1383)
Access98 というと、Macの方ですか? Windows版しか触ったことがないので、違っているかも知れませんが… 例えば、Recordsetを大量に開きまくって、全然Closeしていないとかの箇所はありませんか?
補足
ARCさん 前回(11/4)の質問(Form位置を知る方法=APIを使う)ではお世話になりました。 Macではなく、OSはWindows Meです。Formを二つ開いてます。RecordsetのrsをPublic rs As Recordset宣言して、rsを開くのは一つのSubプロシージャだけで、Set rs = CurrentDb.OpenRecordset・・・としてます。他の複数(5ヶ所)のSubプロシージャでもrsを記述してますが、開く事はしてません。ですから開いているRecordsetは、一つだけとなるはずですが・・・? rsをCloseする記述は一つも有りません。 変更するデータは、rs.Updateとする事で完全に更新されて保存されると考えるのは間違いですか? Closeすることで完結するのですか? そのあたりの概念が理解出来ていないのでしょうか・・・? 宜しくご教授願います。
お礼
ARCさん へ >出来るだけローカルで宣言する べきとの由、その様に改造してみます。 大変有り難う御座いました。