繁体   English   中英

即使在command.executeReader()期间发生SQL异常,如何从查询中获取结果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM