我正在使用LINQ to SQL来调用存储过程。此存储过程当前返回结果集,然后在检索结果集后触发一些raiserror
语句(我正在编写存储过程的测试,如果您想知道我为什么这样做)。
当LINQ to SQL调用proc并且它返回结果集时,它似乎忽略了我抛出的所有错误,因为它得到了结果集。当我从SQL执行raiserror
时,有没有办法让它始终抛出SqlException?
答案 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)