

Access98のVBAでプログラムを組み、RecordsetをUpdateしたり、Deleteしたりしていると、『実行時エラー'3003':ネストしているトランザクションが多すぎるため、トランザクションを開始できませんでした』とエラーが発生します。
「トランザクション」の意味が分かりませんが、プログラムの中では、「トランザクション」なるモノを定義や設定したりしておりません。
ヘルプを閲覧すると「BeginTrans」「CommitTrans」「Rollback」と云う難しそうな言葉が出てきました。
エラーが発生しないようにするためには、プログラムの中にどの様なエラー回避の語を書き込んで置けば良いのでしょうか?
No.2ベストアンサー
- 回答日時:
>RecordsetのrsをPublic rs As Recordset宣言して
コレがまずいかも…
レコードセットは出来るだけローカルで宣言しましょう。
>Closeすることで完結するのですか?
OpenRecordSetで生成されてから、 .Closeするか、その変数(インスタンス)が破棄されるまで、レコードセットは有効です。
Updateは、単にDBにデータを格納するだけの操作です。
DBプログラミングの世界では、一つのレコードセット/カーソルを開きっぱなしにして、Closeもせずに何度も使いまわしにすることは、「やってはいけないこと」の一つだとされています。
上記は、仮にソフトが完璧であれば、別にやっても構わないんことなんですが、DBの方では「積もり積もったら悪影響が出る」系のバグを誘発しますし、アプリケーション側では、「今、どのレコードセットが開いてる/閉じてるのかを(プログラマが)思い違える」系のバグを埋め込みやすくなります。
今回のエラーの原因がそこにあるのかどうかは分からないんですが、トランザクションを使っていないのに、お書きになったエラーが発生するとしたら、まず疑うのはCloseのし忘れでしょう。
No.1
- 回答日時:
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することで完結するのですか? そのあたりの概念が理解出来ていないのでしょうか・・・? 宜しくご教授願います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
Access サブフォームでの選択行の取得
その他(データベース)
-
FindFirst を複数条件で検索
Visual Basic(VBA)
-
-
4
Accessでテーブル名やクエリ名一覧の抜き出し
Access(アクセス)
-
5
フォーム上の全てのコントロールを取得したい
Access(アクセス)
-
6
AccessVBAコミットとロールバックの位置
その他(プログラミング・Web制作)
-
7
Access2010 「演算子がありません」エラー
その他(データベース)
-
8
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
9
Accessの実行時エラーについて
その他(データベース)
-
10
ACCESSのVBAにてExcelのシートをコピーしたい
その他(データベース)
-
11
AccessVBA SetFocusとGoToControlが正常に作動しない
Access(アクセス)
-
12
MS Accessでフォームの「開く時」と「読込み時」のイベントの違い
Access(アクセス)
-
13
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
14
ODBCの接続に失敗しました(3146)について
その他(Microsoft Office)
-
15
Access VBA Me.Requery レコードは削除されています エラー
その他(データベース)
-
16
アクセスからエクセルのシートを追加して、名前をつける方法
Excel(エクセル)
-
17
2つのテーブルに共通するレコードを削除したい
Access(アクセス)
-
18
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
-
19
「RunSQL」と「Execute」の違い
Access(アクセス)
-
20
Accessフォームで画面をスクロールさせるには?
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
汎用系システムのDBについて
-
DATファイルをEXCELで開きたい
-
復元に異常に時間がかかる
-
オブジェクトブラウザとoracle...
-
ログファイルの圧縮がされずに...
-
ファイルメーカーで変更禁止を...
-
SQLローダーを使ってExcelのデ...
-
SQL Server Management Studio ...
-
SQLServerバックアップ戻せない
-
復旧中のデータベースについて
-
ACOSのRDBについて教え...
-
接続されてるユーザーを切断す...
-
作成したDBを使いたい
-
AccessのLANでの共有
-
ADOで別ユーザが開いているエク...
-
SQLLDRで、10M程度のテキストの...
-
マスタメンテとは?
-
DBを復元したら「読み取り専用...
-
PostgreSQLのエクスポートについて
-
エクセルのフィルタ抽出が固まる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
Accessdでの「トランザクション...
-
dbFailOnError とは?
-
TPSとは・・・
-
OracleのROWIDについて…
-
汎用系システムのDBについて
-
一つのトランザクションでSELEC...
-
PHP-オラクルでのトランザクション
-
PostgreSQLのクラスタ運用について
-
jmeterについて、教えてください。
-
トランザクション
-
DBMSのロールフォワードについて
-
どうやって指定してよいかわか...
-
ADO Connection を再利用する方法
-
SAPのSPROって何の略ですか?
-
SQL Server 2005トランザクショ...
-
DBのレプリケーション(MS SQL S...
-
トランザクション
-
警察はスマホに保存した動画や...
おすすめ情報