• 締切済み

dbFailOnError とは?

DAOでExecute の後につける dbFailOnError について教えて下さい。 調べたところ、これをつけておくと sqlが失敗した時にロールバックがかかるとのことでした。 となると、今成功した時はcommit  失敗した時はrollbackと指定しているのですが、 失敗した時にrollbackという記述は 書かなくてもいいのでしょうか? On Error ステートメントで エラー時にrollbackするようにしています。 どなたか詳しく教えてくださると助かります。

  • GBSGBS
  • お礼率36% (370/1012)

みんなの回答

noname#89342
noname#89342
回答No.1

commitやrollbackはトランザクション単位、dbFailOnErrorは文単位なのかもしれません。 なので、コーディングは今まで通りで良いと思いますよ。私も同じように書いてます。

関連するQ&A

  • accessVBAでのワークスペース

    こんばんわ。 今年の四月から新米SEとして働いているものです。 他の言語の場合どうなるかわかりませんが、accessの場合、トランザクションを開始してSQL文を実行する際、「データベース.Execute SQL文」となると思うのですがDAOやADOで接続する際、最初のほうでワークスペースを定義しますよね。 トランザクションの開始、コミットやロールバックは、「ワークスペース.BeginTrans、ワークスペース.CommitTrans、ワークスペース.RollBack」なのになぜSQLを実行するときだけ「データベース.Execute SQL文」なのでしょうか? 私なりの考えでは、ワークスペースは中間作業領域。中間作業領域でなにかしらのエラーが起きたらロールバック、もし問題なければコミットするのでワークスペース.Commit等というのは理解したのですが、SQL文を実行するのはトランザクション中なのでワークスペースで実行「ワークスペース.Execute SQL文」なのではないのでしょうか? ワークスペースへの理解が誤っているのでしょうか? よろしくお願いします。

  • Access95→Access2003にしたら不具合が・・・

    Access95→Access2003にバージョンアップしました。 所々修正はしましたが、わからない点があります。 約5000件のデータがあります。検索条件に一致するデータだけを印刷しますが、例えば「五十音順」にすると 途中までが五十音順で その後はランダム(あ・い・う・え・お・か・き・お・く等)になります。 3回位繰り返しますと、正確に「五十音順」になりました。 1回で、ソートしたいのですが どうしたら良いかアドバイスをお願いします。 WkSql=INSERT INTO 印刷作業用テーブル SELECT * FROM 会員情報テーブル WHERE リスト表示=FASE AND (IIF(会員種別=NULL,'',会員種別) BETWEEN '01' AND '01')AND (退会フラグ=false) ORDER BY フリガナ '作業用テーブル作成 =============================================>> Set データベース = CurrentDb Set SQLステートメント = データベース.CreateQueryDef("") 'まず、作業テーブルをDELETEする。 SQLステートメント.SQL = "DELETE FROM 印刷作業用テーブル;" SQLステートメント.Execute dbFailOnError 'ERROR時、Rollbackする指定。 '続けて、データ抽出&作業テーブル作成。 SQLステートメント.SQL = WkSql & ";" '末尾にセミコロンを付ける。 SQLステートメント.Execute dbFailOnError 'ERROR時、Rollbackする指定。 Set データベース = Nothing 作業用テーブル作成 = 0

  • SQL実行エラー時のロールバックについて

    クエリアナライザを使用し、以下のような複数のステートメントを実行するクエリを流します。 「BEGIN TRANSACTION TRAN_X INSERT文1; INSERT文2; UPDATE文3; …」 最終的に成功したら commit、途中でエラーが出たらrollbackしたいと考えています。 @@ERRORでなくJAVAでいう「try~catch」またはVBでいう「ON ERROR」構文のようなものはないのでしょうか? どなたかご教授お願いします。

  • ADO接続のトランザクション処理

    SQL2005のDBに対して ADOのconnectionオブジェクトで接続しているのですが、 下記のようにトランザクションを開始し、SQLを実行し、 エラーが発生してロールバックを行っていない場合、 2個目のSQLがいつまでたってもロック状態でタイムアウトになりません。 このような場合、ADOconnectionのコマンドタイムアウトのデフォルト値30秒で タイムアウトとなり、ロールバックされないのでしょうか? 以下adoコネクションオブジェクトをConnobjと表記します Connobj.BeginTrans Connobj.Execute "Insert into AAA・・・・" ← このInsert文で失敗 Connobj.Execute "Update BBB SET ・・・・" ← このUpdateは成功 ※ロールバックもコミットも行わない  (プログラムの不具合でロールバックができなかった場合や、  アプリで異常が発生してロールバックが行えない等) お手数をおかけしますが、何かご存知の方、ご教授願います。

  • PHP+MySQLでrollback出来ない

    PHP5 + MySQL5環境です。 以下のようなソースでロールバックさせたいのですが、 実行後、「phpMyAdmin」というDB操作ツールで対象テーブルを見てみると データが登録されてしまっています。(ロールバック出来ていない!?) どなたか原因がお解りでしたらご教授の程宜しくお願い致します。m(_ _)m ※ソースが見難いので、画像で見やすいものを添付します。 ※尚、catch句のデバッグは「bool(true) ロールバック実行」と返ってきます。 //***メイン処理ソース***************************** $sObj = new SQL_Controller(); $res = $sObj->tran_start(); if(!$res) exit; try{ //DB登録------------------ $res1 = $sObj->Customer_mst_Insert($_SESSION['CustomerInfo']); if(!$res1) throw new Exception("Customer_mst_Insert error"); throw new Exception("★rollbackテストの為、ここでワザとthrowしてみる★"); //コミット------------------ $sObj->tran_commit(); } catch(Exception $e) { //異常時はロールバックする-- $res = $sObj->tran_rollback(); var_dump($res); echo "ロールバック実行"; } //***↑メイン処理終わり。以下クラス。***************************** class SQL_Controller extends MySQL{ } class MySQL{ function query($sql){ //クエリ実行 return mysql_query($sql); } function tran_start(){ //■トランザクション開始------ try{ $res = $this->query("set autocommit = 0"); if(!$res) throw new Exception(); $res = $this->query("begin"); if(!$res) throw new Exception(); } catch(Exception $e) { return false; } return true; } function tran_commit(){ //■コミット------ return $this->query("commit"); } function tran_rollback(){ //■ロールバック------ return $this->query("rollback"); } }

    • ベストアンサー
    • PHP
  • SQL実行エラー時にロールバックするには?

    クエリアナライザで複数のSQLを順番に書いて、データ移行スクリプト を作成しています。はじめは BEGIN TRAN ではじめるとして、 最終的に成功したら commit、途中null制約などでエラーが出たら rollbackしたいと考えています。 そういった簡単な制御構造を実現するにはどうしたら良いのでしょうか?

  • データ削除とSQL*Loaderでのインポート

    SQL*Loaderを使ってデータをインポートするのですが、既存データが存在するテーブルにインポートするため、実行前に、条件に一致する一部のデータを削除します。 ですが、SQL*Loaderでインポートが失敗した際には、元に戻したいと思っています。 そういう場合に、SQL*PlusからDELETEのSQL文を実行してから、SQL*Loaderを起動してインポートするとなると、SQL*Plusから抜けた時点でCOMMITされてしまいますよね?そのためSQL*LoaderでインポートがエラーになってROLLBACKされても、削除されたデータは元に戻らないですよね・・・。 全件削除なら、CTLファイル内でREPLACEを指定してインポートするのですが・・・ データの一部削除とSQL*Loaderでのインポートを一連の処理として、エラーの際にはROLLBACKさせられる方法はありますでしょうか? よろしくお願いします。

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

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

  • insert1つの処理でもトランザクションは必要?

    お世話になります。 現在、MYSQLデータベースを使用したプログラムを書いており、 そこでトランザクションについて質問があります。 トランザクションとは、複数の処理がすべて成功した場合に正式な処理を実行(commit)、1つでも失敗した場合は元に戻す(rollback)というようなことかと思うのですが、 では、1つの処理のみの場合は、トランザクションを使用する必要はないのでしょうか? 例えば、 ・あるテーブルにデータをinsertしたい。 このような単一の処理を書く場合でも、 以下のようにトランザクションを使うべきでしょうか? $dsn = 'mysql:dbname=〇〇〇;host=〇〇〇;charset=utf8'; $user = 'user'; $pwd = 'pwd'; //DB接続 try { $pdo = new PDO($dsn, $user, $pwd); } catch (PDOException $e) { die('DB接続失敗'); } //トランザクション開始 $pdo->beginTransaction(); //INSERT try { $sql = 'INSERT into table (test1, test2, test3) VALUES (:a, :b, :c)'; $st= $pdo->prepare($sql); $ret = $st->execute(array( ':a' => $a, ':b' => $b, ':c' => $c, )); if (!$ret) { throw new Exception('INSERT 失敗'); } //commit $pdo->commit(); } catch (PDOException $e) { //rollback $pdo->rollBack(); } $pdo = null; ※前提として、テーブルを使用するユーザーは多数います。 ご存知の方、ご回答いただけるれば幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • TRANSACT-SQLでのシステムエラーの検知

    TRANSACT-SQLで下記のような処理を記述したとき、 (1)~(3)で起きたシステムエラーの検知はCATCHで共通的に行えますか? TRY  SELECT処理  ↓  エラー発生(1)  ↓  INSERT処理  ↓  エラー発生(2)  ↓  UPDATE処理  ↓  エラー発生(3) CATCH  GOTO 異常終了処理 END COMMIT :異常終了定義 ログ出力(エラーメッセージ) ロールバック ※エラー処理は、テーブルがDROPされていた、ディスクが破損したなどの通常は発生しないエラーが起きた場合を想定しています。 ※エラーメッセージはステートメントが最終の処理の結果を持ってくれていて、その取得方法があると思っています。 もし実現できなかったり、実現出来たとしても問題があるようであればご指摘頂きたく存じます。