2017-02-11 125 views
1

SQL Serverデータベースに対してC++で記述しています。私はSQLTransactionというオブジェクトを持っています。オブジェクトはコードブロックの始めに作成されたときにSQL Serverに「begin transaction」を送ります。ROLLBACK TRANSACTION要求にSQL Serverエラー8114に対応するBEGIN TRANSACTIONがありません。

次に、1つ以上のSQL文をサーバに送信します。すべてが順調に進んだら、SQLTransactionオブジェクトにフラグを設定して、一連のコマンドがうまくいったことを知らせます。 SQLTransactionオブジェクトが有効範囲外になると、フラグの状態に応じて、トランザクションのコミットまたはトランザクションのロールバックがサーバーに送信されます。

は、それは次のようになります。私が悪いのコマンドを送信し、これらのブロックのいずれかにSQL文を持っていたし、そのコマンドは、SQLエラー8114

変換エラーデータ型を投げた

{ 
     TSQLTransaction SQLTran(); 

     try 
     { 
      Send(SomeSQLCommand); 
     } 
     catch(EMSError &e) 
     { 
      InformOperator(); 
      return; 
     } 

     SQLTran.commit(); 
    } 

varcharから数値

私はその後、この特定の問題を修正しました。私が理解できないことは、メッセージで2番目のSQLエラーも受け取っていたということです。

ROLLBACK TRANSACTIONリクエストに対応するBEGIN TRANSACTIONがありません。

このトランザクションが失敗した後にロールバックされる可能性があるかどうかはわかりません。

この全く同じSQLTransactionオブジェクトは、アプリケーションの多くの場所で使用されていますが、今までは常に正しく動作していたようでした。このSQLエラーは、何らかの理由で扱われているようです。 SQL Serverが自動的にロールバックするエラーがいくつかありますか?私は本当にここで何が起こっているのか理解したいと思います。

おかげ

+0

SQL文の内部にトランザクションロジックを配置できないのはなぜですか? –

答えて

0

SQL文がエラーをスローした場合、現在のトランザクション(複数可)の運命を決定し、接続オプション、SET XACT_ABORTは、あります。基本的に、OFFに設定すると、トランザクション(通常は)が存続し、実行が継続されます。 ONの場合、現在の接続で開いているすべてのトランザクションがロールバックされ、バッチが終了します。

オプションが設定できます。接続レベルで

  1. データベースアクセスドライバによって、接続オプションのデフォルト値が異なる場合があります。
  2. SQL Serverインスタンスレベルに既定値があります。

最近変更されたかどうかを確認してください。また、SQLプロファイラでトレースをキャプチャする場合、 "ExistingConnection"イベントは現在の接続設定を一覧表示します。あなたはいつでもオプションの状態をチェックして、それがオフになっている場合にはそれを排除することができます。その場合、トレースを見てみると、クライアントコードからはわからない追加のコマンドがサーバーに送信されることがあります。

関連する問題