LINQ to SQL:返回结果集后,将忽略存储过程中的错误

时间:2009-09-22 14:12:49

标签: sql-server linq-to-sql

我正在使用LINQ to SQL来调用存储过程。此存储过程当前返回结果集,然后在检索结果集后触发一些raiserror语句(我正在编写存储过程的测试,如果您想知道我为什么这样做)。

当LINQ to SQL调用proc并且它返回结果集时,它似乎忽略了我抛出的所有错误,因为它得到了结果集。当我从SQL执行raiserror时,有没有办法让它始终抛出SqlException?

2 个答案:

答案 0 :(得分:6)

有趣;这是我在使用IDataReader之前遇到的一个问题,这就是我现在虔诚地消耗所有表格的原因(即使我只是期待一个) - 例如,如果我是只期待一张桌子,例如:

    while (reader.Read())
    { // read data from first table

    }
    // read to end of stream
    while (reader.NextResult()) { }

问题是错误会在你提出它时进入TDS;所以,如果你在TDS中的SELECT之后的表中提高它 - 如果读者没有读到流的末尾,他们可能看不到它。

我会说实话 - 我的首选答案是:在数据之前提出所有错误。这可能意味着将主SELECT放入临时表(#table)或表变量(@table)。除此之外 - 如果它是 critical 来捕获此错误(如果内置的LINQ-to-SQL代码没有帮助),那么可能会回到ExecuteReader以及类似上面的内容

怀疑(但我没有检查过)你也可以使用DataContext.Translate<T>做一些ORM重举;例如:

// cmd is our DbCommand, and ctx is our DataContext
using(var reader = cmd.ExecuteReader()) {
   var result = ctx.Translate<MyResultType>(reader).ToList();
   while(reader.NextResult()) {}
   return result;
}

答案 1 :(得分:2)

按照以下方式调用RAISERROR时,请确保您的严重级别大于10:

http://support.microsoft.com/default.aspx/kb/321903

RAISERROR('Stored Procedure Execution Failed',15,1)