[英]How can I grab results from a query even if an SQL exception occurs during command.executeReader()?
我有这段代码有时有效,有时无效。 正在执行的查询不是我自己编写的,但是我被告知,我要做的就是对数据库运行该查询以获得所需的结果。 这是我的代码:
try {
using (SqlDataReader dr = cmd.ExecuteReader()) {
while (dr.Read()) {
try {
list.Add(dr.GetString(3) + " " + dr.GetInt32(4).ToString() + " " + dr.GetString(5) + " " + dr.GetDecimal(8).ToString());
} catch (Exception e) {
list.Add("fail");
}
}
}
} catch (SqlException sqlException) {
Debug.WriteLine(sqlException.Message);
}
有时会收到错误消息,因为我没有权限或该表不存在,所以无法删除该表。 其他时候查询执行没有任何问题,我能够检索结果并将其存储在列表中。
当我在SQL Server 2008中运行查询时,有时确实会出现错误,但是结果仍然显示出来,并且是我所期望的。 所以我的问题是:无论感觉何时出现错误,如何都能获得这些结果?
这是引起我麻烦的一小部分查询:
IF EXISTS (SELECT * from tempdb..sysobjects where name like '#TABLE%')
DROP #TABLE
我正在运行的查询中有许多此类if语句,并且无法预测哪个将导致错误。 所以我现在所做的就是将DROP #TABLE包围在try-catch块中,以便至少我仍然可以在Silverlight程序中检索结果。 我会站起来,问他为什么查询会自发返回这些错误。
编辑
没关系,我看到了问题。 我忘记了临时表名称后面会附加其他字符,以防止不同进程之间的命名冲突(例如#TABLE___...___0000000064E2
)。
我的猜测是,在某些情况下,存储的proc将创建一个名为“ #TABLE”的临时表,并且您发布的SQL代码的一部分是用来执行清理的。 单独运行时,这可能工作正常。
当存储的proc由多个客户端同时运行时,或者如果先前的查询之一以某种方式无法执行清除(可能是由于途中的错误),问题可能开始出现。 在这种情况下,会创建一个误报(存储的proc认为有必要进行清理,但实际上看到的是由另一个进程创建的temp表)。 然后,您会收到错误消息,因为当前进程没有关联的#TABLE。
无论如何,将语句包装在try-catch中似乎是一种不错的方法。 更好的方法是对代码进行彻底检查,也许设置某种标志以帮助指示需要进行清理,或者使用公用表和某种事务键(删除与当前事务关联的所有记录,而不是删除)桌子)。
您可能还需要考虑使用表变量而不是临时表。
看到:
http://social.msdn.microsoft.com/Forums/zh-CN/sqltools/thread/02337dd5-5cfd-40d8-b529-12dc557d6a7e/
或者,您也可以考虑完全跳过DROP
语句:
临时表范围?
要回答您的原始问题,无论如何,我都不知道从SQL查询引发异常后就无法通过.NET程序集检索结果的任何方法。 SQL Server Management Studio使用一些重型的,定制的API,这可能不值得您学习和使用。
忽略以下内容
(供参考)
如果可以,请尝试将SQL查询更改为
IF EXISTS (SELECT * from tempdb..sysobjects where name = '#TABLE')
DROP #TABLE
( = '#TABLE'
like '#TABLE%'
更改为= '#TABLE'
like '#TABLE%'
= '#TABLE'
)
该like
声明没有任何意义......如果有开头 “#TABLE”其他表没关系......你只是想知道是否有一个名为正是 “#TABLE”表。
我的猜测是,这是逻辑发生改变的情况之一,但是只是中途改变了,也许是两个不同的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.