0

我有两张桌子:

  1. 财产
  2. 属性_本地化

和一个从属性中删除记录的 SP:

  1. (删除_SP)

我有一个触发器,它触发而不是从属性中删除记录,它Property_Localize首先从表中删除相关记录,然后从属性表中删除记录。

Property table's主键也在其他一些表中用作外键。

现在我们正在尝试从中删除记录Delete_SP.

如果该property表在任何其他表中有关联的记录,则它会抛出异常,此异常将在中处理try..catch block,因此无论如何 SP 在输出参数中返回一些默认值并成功执行。

如果我们从后端(SQL Server Management Studio)运行这个 SP,这绝对可以正常工作。

但是当我们从 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

也许这会有所帮助。[加粗表示我的重点]

http://msdn.microsoft.com/en-us/library/ms175976.aspx

不可提交事务和 XACT_STATE

如果 TRY 块中产生的错误导致当前事务的状态无效,则该事务被归类为不可提交事务。当错误发生在 TRY 块内时,通常在 TRY 块外结束事务的错误会导致事务进入不可提交状态。不可提交的事务只能执行读取操作或 ROLLBACK TRANSACTION。该事务不能执行任何会生成写操作或 COMMIT TRANSACTION 的 Transact-SQL 语句。如果事务已被归类为不可提交事务,则 XACT_STATE 函数返回值 -1。批处理完成后,数据库引擎会回滚任何活动的不可提交事务。如果在事务进入不可提交状态时没有发送错误消息,则当批处理完成时,将向客户端应用程序发送错误消息。这表示检测到并回滚了一个不可提交的事务。

有关不可提交事务和 XACT_STATE 函数的详细信息,请参阅 XACT_STATE (Transact-SQL)。

于 2012-03-29T18:49:11.560 回答
0

SSMS 可以拥有自己的配置设置,这些设置在执行存储过程时使用,这些设置与从 Ado.Net 调用存储过程时使用的设置不同。默认情况下,来自 Ado.Net 的连接应使用默认的服务器设置,如果两者之间存在差异,则可能会导致差异。

于 2012-03-29T17:31:37.250 回答