• ベストアンサー

ExecuteSQLについて

お世話になります。 只今ExecuteSQLという関数を使って INSERT文を発行しています。 ですが、この処理の後、ロールバックを行なって処理を取り消したいのですが、 ロールバックもうまく行かず、どうやらExecuteSQLを通った時に 既にINSERT文の内容がコミットされてしまっているのではないかと考えているのですが、どなたかご存知の方、アドバイスをお願い致します。 …MSDN見てもよくわからなかったので… また、ロールバックするにはなにか別の方法がないかなどお聞かせ頂けたら幸いです。

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

  • ベストアンサー
  • msystem
  • ベストアンサー率42% (79/186)
回答No.1

ミドルウェア(ADO、DAOなど)を何を使ってられるのか書いていないので、はっきりは分かりませんが、トランザクションのはじめに、「Begin Trans」、コミットするときに「Commit Trans」、ロールバックするときには「Rollback Trans」と記載すれば大丈夫だと思います。 このあたりをキーワードにして、MSDN(DAOならDAOのヘルプ)を探していただければ、詳細があると思います。

masaichi1212
質問者

お礼

Commit TransとRollback Transを書いたらうまくいくようになりました。 わかりやすく教えて頂いてありがとうございました。

関連するQ&A

  • CDatabase::ExecuteSQL()について

    CDatabase::ExecuteSQLで分からない事があります。 アドバイスを頂けますようよろしくお願い致します。 (質問内容) 以下の処理を実施するとエラーが発生する場合があります。 CDBExceptionのメンバー値は以下の通りです。 m_nRetCode=-1 m_strError=null m_strStateNativeOrigin=null エラー原因が全く分からないのですが、 エラー原因と、どうしたらエラーが発生しないか 対応方法を教えて頂けますでしょうか? try { CDatabase::ExecuteSQL(pszSQL); } catch(CDBException* pEx) { // エラー処理 return FALSE; } return TRUE; ※pszSQL="INSERT文"

  • カーソルエラー

    カーソルエラーについて質問です。 phpからpearを使ってoracleへ接続しています。 バッチ処理で大量にSQL文(SELECT,INSERT,UPDATE)を発行したいのですが、カーソルエラーになってしまいます。 途中の処理でエラーになった場合はロールバックしたい為最後までコミットできません。また、なるべく少ないSQL発行で済むようにプログラムを組み替え済みです。 で、少々手詰まりといった状況なのですが、コミットする以外でカーソルエラーを回避する方法はあるでしょうか? DB設計から見直さないとだめですかね…。

    • 締切済み
    • PHP
  • iBatisでのロック、コミットとロールバック

    お世話になります。 現在、javaで以下のような処理を考えています。 1.空っぽのLockテーブルをロックする。ロックできた人だけ、以下の処理を行う。  ロックできなかった人は待ち状態。 2.selectとかupdateとかinsertとか、Httpリクエスト投げたりレスポンス受け取ったり。  select,update,insertするテーブルはLockテーブルではない。 3.2の処理が全て成功したら、1でロックしたテーブルをコミットして解除。  どこかで失敗したら全部ロールバック。 これを、以下の環境で実装したいです。 ・Java 1.6.0_16 ・Spring 2.5.1 ・iBatis 2.3.0.677 ・PostgreSQL 8.3.8 iBatisでLockとLockの解除、コミットとロールバックを行う方法が分かりません。 どなたかご存知でしたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • 【2005】トリガエラー時の呼び出し元のコミット

    はじめまして。 現在、SQLServer2005を利用したアプリケーションのメンテナンスを行っています。 今回、あるテーブルに変更があった際に、その内容を他テーブルに登録するという内容のプログラムを作成しています。 本来であれば、アプリケーション側にてそのテーブルに対する変更時に、併せてもう一つのテーブルに内容を書き込めばいいのですが、現状のアプリケーションが全体の仕様書がなく、該当テーブルに変更を行う部分を全て洗い出すことが難しい状況となっています。 そのためにトリガにて処理を行おうと考えています。 ここで、質問です。 トリガ内でエラーが発生した時、通常であれば呼び出し元のクエリまでロールバックされてしまいますが、トリガでの処理のみロールバックを行い、呼び出し元の処理はコミットしたいと考えています。 トリガ内にて例外をcatchして、その部分でraiserrorを発行しなければ 可能かと思い、そういう実装を行ったのですが、やはり呼び出し元のクエリまでロールバックされてしまいます。 トリガでの処理のみロールバックし、呼び出し元のクエリはコミットするような方法をご存知でしたらご教示ください。 よろしくお願いします。

  • PGなんですがSEから無茶な要望があり、

    1つの処理が終わったらコミットを出して確定するのですが、 5つ前にさかのぼってロールバックしてほしい。と。 コミットの意味。!と言って口論になりましたが聞き入れてくれない。 どうしたら良いですか?

  • INSERT分の処理速度がトランザクションを開始している時の方が速い

    SQLServerについて質問させていただきます。 ・トランザクションを開始せずにINSERT文を発行した場合 ・トランザクションを開始してINSERT文を発行した場合 上記の2ケースでは、まったく同じINSERT文でも 開始して発行したほうが 処理が速いという状況になっています。 (Management Stadioで発行) SQL Server Profiler にて確認して、処理時間、CPUの使用時間ともに明らかな差があります。 トランザクションを開始してる状況の方がINSERT文は速い、というのはなにか設定で変えられるのでしょうか?それとも仕組みとして当然そういったものなのでしょうか?(コミットするまでは物理的に書き込まないから、などの理由で) 判断が付かず、非常に困っています。そういう仕組みであるというならば、そういう想定でプログラムを修正するのですが、根拠がわからず、修正に入ってよいかどうか困っています。 本当に困っておりますので、どんな手がかりでもよいのでお教えいただけたらと思います。宜しく御願いいたします。

  • トランザクションとlast_insert_id

    トランザクション中にinsertする予定のテーブル(未コミット)のauto_increment値を取得することはできるのでしょうか。 以下のような処理を期待しているのですが、hoge1テーブルのauto_increment値が取得できずに困っております。last_insert_id に関わらず、hoge1テーブルのauto_increment値が取得できる方法があれば教えてください。 (1) トランザクション開始 (2) $sql=" INSERT INTO hoge1(name) value('あああ'); "; (3) ( ロールバック ) (4) $key=mysql_insert_id(); (5) $sql2=" INSERT INTO hoge2(hoge1_primary,age) value($key,'20歳'); "; (6) ( ロールバック ) (7) コミット (8) トランザクション終了 よろしくお願いします。 環境: php5,mysql5 (InnoDB)

    • ベストアンサー
    • MySQL
  • 複数のSQL文を一つのトランザクションで行いたい(SQL Server)

    Visual Basic 2005 から SQL Server に接続してINSERTやUPDATE処理を行いたいのですが、トランザクション処理の記述方法が分かりません。 コネクションオープン トランザクション開始  クラスA呼び出し(INSERTやUPDATEの処理記述)  クラスB呼び出し(INSERTやUPDATEの処理記述)  … コミット(またはロールバック) トランザクション終了 コネクションクローズ 上記の様に、いくつかのクラスに分けて記述したINSERTやUPDATEの処理を、一つのトランザクションで行いたいです。 コネクションやトランザクションを引数とすればよいのでしょうか?

  • ACCESSでリンクテーブルへINSERTするのは?

    的外れな質問だったら申し訳ありません!!(涙) どなたか教えてください!!!(泣) リンクテーブルにInsertを行いたいのです! 現在こういうコードになっています。↓ ※InterBase5.0/ACCESS2000を使用しています。 ※ユーザーIDなどは別の関数で取得して文字列変数で帰ってきます。 Public G_Wksp As Workspace Public G_openDb As Database Set G_Wksp = CreateWorkspace("", sUID, sPWD, dbUseODBC) Set G_openDb = G_Wksp.OpenDatabase(sDSN, , False, _ "ODBC;DATABASE=" & sDb & ";UID=" & sUID & ";PWD=" & sPWD & ";DSN=" & sDSN) で、つないで、 G_Wksp.BeginTrans G_openDb.Execute "Insert_SQL文1" G_openDb.Execute "Insert_SQL文2" G_openDb.Execute "Insert_SQL文3" 3つとも正常終了だったら … G_Wksp.CommitTrans 'コミット どれか異常終了だったら  … G_Wksp.Rollback 'ロールバック で、Insertしています。 INSERTはちゃんとされているのですが…エラー発生時にロールバック処理がされていないのです…(汗) どこが変なのか教えていただけないでしょうか…(泣) イイ方法教えてください。よろしくお願いします!

  • PHP-オラクルでのトランザクション

    PHP-オラクルでのトランザクションについて 教えてください。 *すべてPHP(OCI8関数)のWEBアプリからが前提です。 1.OCIExecute()でOCI_DEFAULT(自動コミットOFF)を指定した状態で   コミット(OCICommit)をせずにログオフ(OCILogoff)した場合、 コミットされるのか、それともロールバックされるのか? 2.OCIExecute()でOCI_DEFAULT(自動コミットOFF)を指定した状態で   コミット(OCICommit)もログオフ(OCILogoff)もしていない状態で WEBブラウザを閉じた場合、コミットされるのか、それとも   ロールバックされるのか? の2点です。自分で試せればいいのですが、もうしばらくの間 オラクル環境がないまま、プログラムを作成しなければならない状況です。。。 ご存知の方がおりましたらご教授していただければ幸いです。 よろしくお願いします。