0

私は2つのテーブルを持っています:

  1. 財産
  2. Property_Localize

プロパティからレコードを削除するSP:

  1. (削除_SP)

Property_Localizeプロパティからレコードを削除する代わりに、最初にテーブルから関連するレコードを削除し、次にプロパティテーブルからレコードを削除するトリガーがあります..

Property table's主キーは、他のテーブルでも外部キーとして使用されます。

今、レコードを削除しようとしていますDelete_SP.

propertyテーブルに他のテーブルのレコードが関連付けられている場合、例外がスローされます。この例外は で処理されtry..catch blockます。したがって、いずれの場合でも、SP は出力パラメータにデフォルト値を返し、正常に実行されます。

この SP をバックエンド (SQL Server Management Studio) から実行すると、これはまったく問題なく機能します。

しかし、asp.net からこの SP を実行すると、次のエラーが発生します。

「バッチの最後にコミットできないトランザクションが検出されました。トランザクションはロールバックされます。」

適切な出力パラメータを提供しますが。

また、トリガーに try catch と明示的なトランザクション ブロックを追加しようとしましたが、それでも同じエラーが発生します。

どんな助けでも大歓迎です。

言い忘れましたが、CodeSmith の生成されたデータベース レイヤーを使用しています。

4

3 に答える 3

1

SQL プロファイラ

これにより、ASP.Net からデータベースへのリクエスト中に、クエリのすべてのフェーズを追跡できます。


ストアド プロシージャは次のようになります。

Create Proc ProcedureName 
@UserName Varchar(50), 
@Password Varchar(50), 
@Email Varchar(50) 
As 
SET NOCOUNT ON 
SET XACT_ABORT ON 

Begin Try 
    Begin Tran 
        //Your Code
    Commit Tran  
End Try 

Begin Catch 
    Rollback Tran 
End Catch 
于 2012-03-29T10:47:34.110 に答える
0

SSMS は、ストアド プロシージャが Ado.Net から呼び出されるときに使用される設定と必ずしも同じではない、sproc を実行するときに使用される独自の構成設定を持つことができます。デフォルトでは、Ado.Net からの接続はデフォルトのサーバー設定を使用する必要があり、2 つの間に違いがある場合は、それが原因である可能性があります。

于 2012-03-29T17:31:37.250 に答える