【问题标题】:Calling SP from asp.net gives error whereas it works fine from SSMS从 asp.net 调用 SP 会出现错误,而从 SSMS 则可以正常工作
【发布时间】:2012-03-29 10:04:21
【问题描述】:

我有两张桌子:

  1. 财产
  2. Property_Localize

和一个从属性中删除记录的 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 生成的数据库层。

【问题讨论】:

标签: asp.net sql-server sql-server-2008 sql-server-2005 codesmith


【解决方案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 

【讨论】:

  • 如果属性记录存在于任何其他表中,我不想删除它。
  • 这是您的原句我有一个触发器触发而不是从属性中删除记录,它首先从 Property_Localize 表中删除相关记录,然后从属性表中删除记录..
  • 是的,我们不能在 Property_Localize 表上实现级联删除,因为它有外键,我们不能在 Property 表上实现它,因为它在许多其他表中也有外键,我不想如果它的值存在于除 Property_Localize 之外的任何其他表中,则将其删除。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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)。

    【讨论】:

    • 执行 SP 的更好方法可能是检查 FIRST 是否有任何子行并且不尝试删除,而不是依靠异常处理来为您捕获它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多