Accessdでの「トランザクションが多すぎる」エラーとは何?

このQ&Aのポイント
  • Access98のVBAでプログラムを組み、RecordsetをUpdateしたり、Deleteしたりしていると、『実行時エラー'3003':ネストしているトランザクションが多すぎるため、トランザクションを開始できませんでした』とエラーが発生します。
  • 「トランザクション」の意味が分かりませんが、プログラムの中では、「トランザクション」なるモノを定義や設定したりしておりません。
  • エラーが発生しないようにするためには、プログラムの中にどの様なエラー回避の語を書き込んで置けば良いのでしょうか?
回答を見る
  • ベストアンサー

Accessdでの「トランザクションが多すぎる」エラーとは何?

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

質問者が選んだベストアンサー

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

>RecordsetのrsをPublic rs As Recordset宣言して コレがまずいかも… レコードセットは出来るだけローカルで宣言しましょう。 >Closeすることで完結するのですか? OpenRecordSetで生成されてから、 .Closeするか、その変数(インスタンス)が破棄されるまで、レコードセットは有効です。 Updateは、単にDBにデータを格納するだけの操作です。 DBプログラミングの世界では、一つのレコードセット/カーソルを開きっぱなしにして、Closeもせずに何度も使いまわしにすることは、「やってはいけないこと」の一つだとされています。 上記は、仮にソフトが完璧であれば、別にやっても構わないんことなんですが、DBの方では「積もり積もったら悪影響が出る」系のバグを誘発しますし、アプリケーション側では、「今、どのレコードセットが開いてる/閉じてるのかを(プログラマが)思い違える」系のバグを埋め込みやすくなります。 今回のエラーの原因がそこにあるのかどうかは分からないんですが、トランザクションを使っていないのに、お書きになったエラーが発生するとしたら、まず疑うのはCloseのし忘れでしょう。

kurichanchi
質問者

お礼

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

その他の回答 (1)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

Access98 というと、Macの方ですか? Windows版しか触ったことがないので、違っているかも知れませんが… 例えば、Recordsetを大量に開きまくって、全然Closeしていないとかの箇所はありませんか?

kurichanchi
質問者

補足

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

  • AccessVBA トランザクション処理について。

    AccessVBAにてコードを作成する際に、 下記トランザクション処理のコードを書くとデータ喪失予防になると 聞きました。(エラーが起きたときには、処理前に戻ると。) この処理は、delete~insertのような処理でないと有効にならないのでしょうか?どんな処理でも有効ですか? Dim Wrk As workspace Dim blnFlag As Boolean Set Wrk = DBEngine.Workspaces(0) Wrk.BeginTrans blnFlag = True ***************************** delete ~insert (update) ***************************** Wrk.CommitTrans blnFlag = False Set Wrk = Nothing Err: If blnFlag = True Then Wrk.Rollback End If

  • ASPでトランザクションをかけるとエラーする「ファイアーホースモード」

    ASPでSQLserverに接続し、レコードの更新をかける際に、 BeginTrans---CommitTrans と記述すると、 「ファイアーホースモードの場合はトランザクションがかけられない」という 主旨のエラーが出ます。 このファイル内でトランザクションをかけている場面はここのみです。 (複数書いていてCursorTypeを設定しないとエラーするのは既に 解決済みです。) そもそも、「ファイアーホースモード」とはどんなモードなのでしょうか?

  • SQLServer 分散トランザクションについて

    現在サーババージョンアップに伴うストアドの動作検証を行っています。 内容としては2000で動作していたものを2008R2に移行するだけです。 そこでひとつ問題が発生して作業がとまってしまいましたので、 お力を借りたく、質問させていただきます。 環境としては、クライアントはACCESSプログラム、DBはSQLServerとなっています。 ストアドの実行で下記のように記載していたプログラムが動作しなくなりました。 Set adoCN = New ADODB.Connection adoCN.Open CurrentProject.Connection adoCN.BeginTrans adoCN.Execute "exec dbo.実行ストアド" 'エラー判定 adoCN.CommitTrans 上記エラー判定で「リンク サーバー "(null)" の OLE DB プロバイダー "SQLNCLI10" から、 メッセージ "アクティブなトランザクションがありません。" が返されました。」 となってしまいます。 また、このストアド内では「SET XACT_ABORT ON ~ SET XACT_ABORT OFF」 としてあります。 ちなみに、上記「adoCN.BeginTrans」、「adoCN.CommitTrans」をコメントすると、 正常に動作しました。 「SET XACT_ABORT ON」としているので「adoCN.BeginTrans」はなくてもいいと思うのですが、 明確に『不要である』としている文献等、見つからなかったため、迷っています。 サーバはバージョンアップに伴い、分散トランザクションを使用するようになっていますが、 この変更が影響しているのかどうか、まったく別の原因なのか、わからない状態です。 うまく伝わっているか心配ですが、どうぞ宜しくお願い致します。

  • asp+dllでのcommitの有効範囲

    aspでトランザクション(BeginTrans、CommitTrans)を定義し、 そのトランザクション内でDB更新機能を持ったdllを使用したとします。 この時、dllでDB更新エラー時DBに対しロールバッグはかけることは可能 でしょうか  asp  BeginTrans  dllを呼ぶ  dllが不正終了時、aspを終了する  CommitTrans  dll   DBを更新(DLL内ではbegintran、committranはしない) もちろんDLLはサーバー内で動かします。 DBはsql server、DLLはvb6.0で作成します。 どうかお力添えを、、、

  • ActiveX DLLでのオラクルのトランザクション

    VB6とOracle9iのOO4Oにてシステムを構築しておりますが、一つ解らないことがありましたので、どなたかご教授願います。 あるPG(通常のEXEです)よりActiveX DLLを呼び出してOracleの表へデータを挿入する処理があります。呼び出し元となる通常のEXEはまずOracleの接続処理を記述しています。正常に接続が完了したならトランザクションを開始し、表のDeleteを実行します。その後ActiveX DLLを呼び出して表のInsertを実行しています。再び通常のEXEに制御が戻り、トランザクションの完了(COMMIT)または破棄(ROLLBACK)を行います。しかし、最後のトランザクションのCOMMIT(ROLLBACK)を行うと『コッミト(ロールバック)時にアクティブなトランザクションがありません』というエラーが発生してしまいます。正しくBegin Transactionを実行しているのに、これはどういうこと何のでしょうか。ご存知の方がいらっしゃましたら教えてください。

  • 手動または分散トランザクションモード…のエラー

      お世話になります。 開発言語:VisualBasic 6 sp6 OS :WindowsXP Pro sp3 DB :Microsoft SQL Server 2005 以下のコードはCommand1ボタンをクリックした時に実行される処理です。 処理内容は、テーブルAを読み、テーブルAの全てのレコードを順次読みながら テーブルBを検索し、テーブルBの"keyname"をprintします。 ※実際のプログラムではテーブルAを順次読むループの中で多数のテーブルへの  新規レコード追加、更新などを行っております。 Private Sub Command1_Click()   Dim objConn   As ADODB.Connection   Dim objRsA   As ADODB.Recordset   Dim objRsB   As ADODB.Recordset   Dim sSQL   As String   Set objConn = New ADODB.Connection   objConn.ConnectionString = cstrCon   objConn.Open   Set objRsA = New ADODB.Recordset   Set objRsB = New ADODB.Recordset   'トランザクション開始   objConn.BeginTrans   sSQL = "select * from テーブルA"   objRsA.Open strSQL, objConn   If objRsA.EOF = False Then     Do Until objRsA.EOF       sSQL = "select * from テーブルB where key = " & objRsA.Fields("key")       objRsB.Open strSQL, objConn    '←この行でエラー発生       Print objRsB.Fields("keyname").Value       objRsB.Close       objRsA.MoveNext     Loop   End If   objRsA.Close   'コミット   objConn.CommitTrans End Sub ↑の処理を実行すると「objRsB.Open strSQL, objConn」の行で以下の実行エラーになります。 "手動または分散トランザクションモードのため、新規接続を作成できません。" このエラーの原因が分からず自分でもいろいろ調べてみました。 以下のサイトも何度も見直してみましたがよく理解できませんでした。 http://support.microsoft.com/kb/234218/ja どこが間違っていて、どこを修正すればエラーが出なくなるのでしょうか? よろしくお願い致します。  

  • postgresqlでのトランザクションについて

    postgresqlで、「WARNING  進行中のトランザクションがありません」のエラーが出てしまいました。 これはそのままの意味だと思うのですが 直す方法がわかりません。 ワーニングなので、、、といいたいところですが、そうもいかず。 apのログで、トランザクション関係の辺りを見ましたところ、 トランザクションを開始し、 TABLEをDROPしようとしましたが、存在しなかった(ようだ)。 (PQexecがエラーでリターン) 存在しないけれど、commit してトランザクションを終わらせている。 のが原因かなと思いました。 なので、PQexec()がエラーの場合はcommitしなければいいのかと はずしましたが結果は同じでした。 トランザクションが無いのだからrollbackもいらないですよね。 そこで質問ですが drop文、1ステップのSQL実行も明示的にトランザクションの処理をしたほうがいいのでしょうか? このワーニングは通常のトランザクションの処理の中で、どういう時にでるのでしょうか? oracleとpostgresqlの明示的・暗黙的な制御に戸惑っています。 (oracleからpostgresqlに移行することになりました) 叱咤でも何でもかまいませんので、アドバイスよろしくお願いいたします。

  • (Windows7)VB6でODBC接続エラー

    動作環境 OS:Windows7(64bit) DB:SQL2008 Express(SP1) VB6ランタイム適用済 お世話になります。 自作のVB6EXEをWindows7で実行したところ、下記のエラーが発生してしまいます。 ErrNo:-2147168242 メッセージ:アクティブなトランザクションがありません。 ソース上のどこで発生しているのか調べたところDBのCommit時に発生 していました。 ソース:  BeginTrans  Insert文  CommitTrans  ←ここでエラー エラーにはなるのですが、Insert文の内容はDBに反映されます。 また、BeginTrans、CommitTransを使用せず、Update、Insertのみを実行した 場合はエラーは発生しません。(DBにも値が登録されます) 現状、RollbackTransができない状態です。 以下は試してみたがダメだった内容です。  ・XPやVistaでは正常に動作していたので、互換モードをVistaに設定して実行  ・Windows7(32bit)で実行 調べていて、ODBCはデフォルトで自動コミットするという記載を見かけたのですが、 DB接続時に何かしらプロパティの設定が必要なのでしょうか? 上記エラーの回避策をご存知の方がいらっしゃいましたら、ご教授願います。

  • エクセルVBA_ADO「ファイアホースモードの間はトランザクションを開

    エクセルVBA_ADO「ファイアホースモードの間はトランザクションを開始できない」 最近、エクセルVBAからSQLサーバーを編集するプログラムの勉強をはじめ、以下のサイトを読みながらテストプログラムを走らせています。 http://www.happy2-island.com/access/gogo03/capter00306.shtml そして、以下のようなコードを走らせて見ると、「ファイアホースモードの間はトランザクションを開始できません」とのエラーが出ます。 コードを以下に記します((2)トランザクションを開始します←ここで上記のエラーが出ます) Sub prcAdoSQLServerDB() Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset '(1)ADOを使いSQL ServerのDBを開きます adoCON.Open "Driver={SQL Server};" & _ "server=aaa\db; database=a1; uid=a; pwd=a;" 'レコードセットの作成(SELECT文の実行) Set adoRS = adoCON.Execute("select * from 明細") 'レコード追加のSQLを定義(フィールド名省略すると、nullを入れようとする) strsql = "INSERT INTO 詳細 (得意先コード) Values(000010)" '(2)トランザクションを開始します adoCON.BeginTrans '(3)レコード追加のSQLを実行します adoCON.Execute strsql '(4)SQL実行結果の判定 If Err.Number = 0 Then '(5)SQLが正常終了したら追加を反映します adoCON.CommitTrans Else '(6)SQLが異常終了したら追加の破棄とエラー内容の表示をします adoCON.RollbackTrans End If End Sub 何が原因なのでしょうか。

  • CSVを取込むストアドプロシージャで、1件目が登録されない現象が起きています

    いつもお世話になっております 古い環境なので大変恐縮ですが、行き詰ってしまったので、 ご教示いただきたいと思います。 環境: WinXP sp2 SQLServer8.0 VB6.0 sp4 VBでCSVのデータ1行について、ストアドプロシージャにて3つのテーブルに格納しようとしています。 トランザクションの管理はVB側で行っています。 1行ごとにCommitを行えば、全行格納されるのですが、 2行以上ごとにCommitを行うと、最初の1行のみが格納されないという現象がおきています。 6800行存在する同じCSVファイルについて、1行ごとにCommitを行った場合は、6800件登録されるのに 処理の最後でCommitをきった場合、6799行しか登録されません。 1行ごとにCommitをきった場合に6800行登録されるので、キー重複は考えられません。 いろいろ試してみたことを下記に書きます 結果はこのような感じです。 CASE1・・・全件登録できます CASE2・・・2件目で重複エラーが発生します CASE3・・・全件 - 1件が登録できます CASE4・・・全件登録できます CASE5・・・全件登録できます CASE2, CASE3 で全件登録できない理由をご教示いただきたく思います。 よろしくお願いいたします。 CASE1(VBでINSERT文を記述)  localConnection.beginTrans localConnection.execute "DELETE FROM TABLE_A" localConnection.execute "DELETE FROM TABLE_B" localConnection.execute "DELETE FROM TABLE_C" FOR i = 1 to 6800 localConnection.execute "INSERT INTO TABLE_A (COL_A1, COL_A2) VALUES ('" & VAL_A1(i) & "','" & VAL_A2(i) & "')" localConnection.execute "INSERT INTO TABLE_B (COL_B1, COL_B2) VALUES ('" & VAL_A1(i) & "','" & VAL_B2(i) & "')" localConnection.execute "INSERT INTO TABLE_C (COL_C1, COL_C2) VALUES ('" & VAL_A1(i) & "','" & VAL_C2(i) & "')" NEXT  localConnection.commitTrans CASE2(ストアドプロシージャ) localConnection.beginTrans localConnection.execute "DELETE FROM TABLE_A" localConnection.execute "DELETE FROM TABLE_B" localConnection.execute "DELETE FROM TABLE_C" ' -- ストアドプロシージャのパラメータ作成 FOR i = 1 to 6800 localConnection.execute NEXT  localConnection.commitTrans CASE3(ストアドプロシージャ) localConnection.beginTrans localConnection.execute "DELETE FROM TABLE_A" localConnection.execute "DELETE FROM TABLE_B" localConnection.execute "DELETE FROM TABLE_C"  localConnection.commitTrans ' -- ストアドプロシージャのパラメータ作成 localConnection.beginTrans FOR i = 1 to 6800 localConnection.execute NEXT  localConnection.commitTrans CASE4(ストアドプロシージャ) localConnection.beginTrans localConnection.execute "DELETE FROM TABLE_A" localConnection.execute "DELETE FROM TABLE_B" localConnection.execute "DELETE FROM TABLE_C"  localConnection.commitTrans ' -- ストアドプロシージャのパラメータ作成 localConnection.beginTrans FOR i = 1 to 6800 localConnection.execute   localConnection.commitTrans   localConnection.beginTrans NEXT  localConnection.commitTrans CASE5(ストアドプロシージャ) localConnection.beginTrans localConnection.execute "DELETE FROM TABLE_A" localConnection.execute "DELETE FROM TABLE_B" localConnection.execute "DELETE FROM TABLE_C"  localConnection.commitTrans ' -- ストアドプロシージャのパラメータ作成 localConnection.beginTrans FOR i = 1 to 6800 localConnection.execute if i = 1 then   localConnection.commitTrans   localConnection.beginTrans end if NEXT  localConnection.commitTrans