2017-02-11 101 views
1

我正在用C++寫入SQL Server數據庫。我有一個叫做SQLTransaction的對象,它在代碼塊的開頭創建時,向SQL Server發送'begin transaction'。ROLLBACK TRANSACTION請求在SQL Server之後沒有對應的BEGIN TRANSACTION錯誤8114

然後我發送一個或多個SQL語句到服務器。如果一切順利,我在SQLTransaction對象中設置一個標誌,讓它知道這組命令進行得很順利。當SQLTransaction對象超出範圍時,它會根據標誌的狀態向服務器發送「提交事務」或「回滾事務」。

它看起來是這樣的:

{ 
     TSQLTransaction SQLTran(); 

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

     SQLTran.commit(); 
    } 

我發送一個指揮不力,這些方框的一個有一個SQL語句和命令扔了SQL錯誤8114

錯誤轉換數據類型varchar數字

我已經修復了這個問題。我不明白的事實是,我還收到第二個SQL錯誤消息

ROLLBACK TRANSACTION請求沒有對應的BEGIN TRANSACTION。

我找不到任何告訴我這個事務可以或不應該在故障後回滾的東西。

這個完全相同的SQLTransaction對象在我的應用程序的許多地方使用,似乎總是工作正常,直到現在。出於某種原因,這個SQL錯誤似乎被區別對待。是否有一些SQL Server自動回滾的錯誤?我真的很想了解這裏發生了什麼。

感謝

+0

爲什麼你不能把事務邏輯放在SQL語句中? –

回答

0

有一個連接選項,SET XACT_ABORT,決定當前事務(S)時的SQL語句拋出一個錯誤的命運。基本上,當設置爲OFF時,事務(通常)存活並繼續執行;如果是ON,則當前連接中所有打開的事務都將回滾並終止批處理。

選項可以設置:

  1. 在連接層;
  2. 不同的數據庫訪問驅動程序可能有不同的連接選項默認值;
  3. 在SQL Server實例級別上有一個默認值。

檢查最近是否有這些變化。另外,如果您在SQL事件探查器中捕獲跟蹤,「ExistingConnection」事件列出當前的連接設置。你可以隨時檢查那裏的選項狀態,並在關閉時排除它。在這種情況下,我會仔細觀察跟蹤,可能會有其他命令發送到服務器,這些命令在您的客戶端代碼中並不明顯。

相關問題