プロが教える店舗&オフィスのセキュリティ対策術

Access98のVBAでプログラムを組み、RecordsetをUpdateしたり、Deleteしたりしていると、『実行時エラー'3003':ネストしているトランザクションが多すぎるため、トランザクションを開始できませんでした』とエラーが発生します。
「トランザクション」の意味が分かりませんが、プログラムの中では、「トランザクション」なるモノを定義や設定したりしておりません。
ヘルプを閲覧すると「BeginTrans」「CommitTrans」「Rollback」と云う難しそうな言葉が出てきました。
エラーが発生しないようにするためには、プログラムの中にどの様なエラー回避の語を書き込んで置けば良いのでしょうか?

A 回答 (2件)

>RecordsetのrsをPublic rs As Recordset宣言して



コレがまずいかも…
レコードセットは出来るだけローカルで宣言しましょう。

>Closeすることで完結するのですか?

OpenRecordSetで生成されてから、 .Closeするか、その変数(インスタンス)が破棄されるまで、レコードセットは有効です。
Updateは、単にDBにデータを格納するだけの操作です。

DBプログラミングの世界では、一つのレコードセット/カーソルを開きっぱなしにして、Closeもせずに何度も使いまわしにすることは、「やってはいけないこと」の一つだとされています。

上記は、仮にソフトが完璧であれば、別にやっても構わないんことなんですが、DBの方では「積もり積もったら悪影響が出る」系のバグを誘発しますし、アプリケーション側では、「今、どのレコードセットが開いてる/閉じてるのかを(プログラマが)思い違える」系のバグを埋め込みやすくなります。


今回のエラーの原因がそこにあるのかどうかは分からないんですが、トランザクションを使っていないのに、お書きになったエラーが発生するとしたら、まず疑うのはCloseのし忘れでしょう。
    • good
    • 0
この回答へのお礼

ARCさん へ
>出来るだけローカルで宣言する
べきとの由、その様に改造してみます。
大変有り難う御座いました。

お礼日時:2002/11/24 21:21

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することで完結するのですか? そのあたりの概念が理解出来ていないのでしょうか・・・? 宜しくご教授願います。

補足日時:2002/11/24 19:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A