我正在使用 LINQ to SQL 调用存储过程。此存储过程当前返回一个结果集,然后在检索结果集后触发一些 raiserror
语句(我正在为存储过程编写测试,以防您想知道我为什么要这样做) .
当 LINQ to SQL 调用 proc 并返回结果集时,它似乎忽略了我抛出的所有错误,因为它得到了结果集。当我从 SQL 执行 raiserror
时,有没有办法让它总是抛出 SqlException?
最佳答案
有趣;这是我以前在使用 IDataReader
时遇到的问题。 ,这就是为什么我现在虔诚地消费所有的 table (即使我只期待一张) - 例如,如果我只期待一张 table ,类似于:
while (reader.Read())
{ // read data from first table
}
// read to end of stream
while (reader.NextResult()) { }
问题是错误在您提出它时进入 TDS;所以如果你在 SELECT
之后提出它然后在 TDS 中的下表中 - 如果读者没有读到流的末尾,他们可能看不到它。
说实话 - 我的首选答案是:在数据之前引发所有错误。这可能意味着做主要的SELECT
放入临时表 ( #table
) 或表变量 ( @table
)。除此之外 - 如果捕获此错误是关键(并且如果内置的 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;
}
关于sql-server - LINQ 到 SQL : errors from stored procedure are ignored after result set is returned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1460342/