【问题标题】:SQL raiserror output in c# asp.netc#asp.net 中的 SQL raiseerror 输出
【发布时间】:2013-11-16 12:13:36
【问题描述】:

我有一个用于测试目的的存储过程总是抛出错误。

UPDATE [Test]
    SET  [1.1] = 0
        ,[1.2] = 0
        ,[1.3] = 0
        ,[1.4] = 0

    WHERE Record_ID = 2 AND
          [1.1] = 0 AND
          [1.2] = 0 AND
          [1.3] = 0 AND
          [1.4] = 0
if(@@ROWCOUNT = 0)
    begin 
    raiserror('Error on purpose',16,1)
END

虽然在 SQL MGMT studio 中引发错误,但它不会在 asp.net 的 try/catch 块中触发。

我这样称呼 SP:

try {
     dataContext.TESTProcedure();
}
catch(Exception ex)
{
    string error = ex.Message;
}

我已经单步执行了代码,但它从不进入 catch,即使它应该进入。

出了什么问题?

【问题讨论】:

  • @@rowcount = 0?我会调试存储过程以确保遇到 raiseerror。
  • 跟踪 SQL Profiler 从代码中传递了什么查询并在 SSMS 中尝试。作为替代方案,在没有 IF 条件的情况下引发错误。
  • 是的,它触发了错误并且行数= 0。错误是在sql management studio中引发的

标签: c# asp.net sql stored-procedures


【解决方案1】:

我会更深入地了解 dataContext 正在做什么。如果它在后台使用数据读取器,则可能必须前进到下一个结果集才能得到错误。

打电话

NextResult

在阅读器上。欲了解更多信息:

“那么我们如何让它工作呢?好吧,当使用 SqlDataReader 时 只会遍历第一个结果集,在这种情况下将 是存储过程中的选择。此结果集将为空 因为没有 ID 号 10 的数据。所以什么都没有显示并且 不访问第二个结果集。我们要做的就是移动 进入下一个结果集以获取错误。

做到这一点的一种方法是如下,即,这将继续进行 返回的结果集,直到 SqlDataReader 关闭,它 将在没有更多结果集返回时。"

http://blogs.msdn.com/b/spike/archive/2009/04/06/catch-a-sql-server-raiserror-at-client-side-using-sqldatareader.aspx

【讨论】:

    猜你喜欢
    • 2014-07-13
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多