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

C# 即使在command.executeReader()期间发生SQL异常,如何从查询中获取结果?,c#,silverlight,C#,Silverlight,我有一段代码,有时有效,有时无效。正在执行的查询不是我自己编写的,但是我被告知我所要做的就是对数据库运行它,以获得我需要的结果。这是我的密码: try { using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { try { list.Add(dr.GetString(3) + " " + dr.GetInt32(4).ToString() + " " + dr.GetStri

我有一段代码,有时有效,有时无效。正在执行的查询不是我自己编写的,但是我被告知我所要做的就是对数据库运行它,以获得我需要的结果。这是我的密码:

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);
}
我有时收到的错误是,我无法删除表,因为我没有权限或该表不存在。其他时候,查询执行时没有任何问题,我能够检索结果并将其存储在列表中

当我在SQLServer2008中运行查询时,有时确实会出现错误,但结果仍然会显示出来,并且是我所期望的。所以我的问题是:我怎样才能抓住这些结果,而不考虑任何时候出现的错误

下面是一个小问题,它给我带来了麻烦:

IF  EXISTS (SELECT * from tempdb..sysobjects where name like '#TABLE%')  
DROP #TABLE
我正在运行的查询中有许多这样的if语句,不可预测哪一个会导致错误。因此,我现在所做的是在try-catch块中围绕DROP表,这样至少我仍然可以在silverlight程序中检索结果。我会去找我的上级,问他为什么查询会自动返回这些错误。

EDIT

没关系,我看到问题了。我忘记了临时表名称附加了额外的字符,以防止不同进程之间的命名冲突,例如表\ u \ u \ u \ u00000000 64E2

我的猜测是,在某些情况下,存储的进程正在创建一个名为table的临时表,而您发布的一些SQL代码旨在执行清理。当单独运行时,这可能工作正常

当存储的过程由多个客户端同时运行时,或者如果前面的一个查询由于中途出错而无法执行清理,则问题可能开始具体化。在这种情况下,如果存储的进程认为有必要进行清理,但实际上看到的是另一个进程创建的临时表,则会创建一个假阳性。然后,由于没有与当前进程关联的表,因此会出现错误

无论如何,用try-catch包装语句似乎是一种不错的方法。更好的方法是对代码进行彻底检查,可能设置某种标志以帮助指示需要进行清理,或者使用公共表和某种事务键删除与当前事务关联的所有记录,而不是删除该表

您可能还想考虑使用表变量而不是TEMP表。

见:

或者,您也可以考虑完全跳过DROP语句:

为了回答您最初的问题,我不知道有什么方法可以在SQL查询引发异常后从中检索结果,无论如何,不是通过.NET程序集。SQLServerManagementStudio使用一些重型定制API,这些API可能不值得您费心学习和使用

忽略以下内容 留作参考

如果可以,请尝试将SQL查询更改为

如果存在,请从tempdb..sysobjects中选择*name='TABLE' 升降台 将“表%”更改为=“表”

like的说法没有任何意义。。。如果有其他表以TABLE开头,这并不重要。。。您只想知道是否有一个名为table的表


我的猜测是,这是其中一种逻辑被改变的情况,但只改变了一半,可能是由两个不同的人改变的。

您应该与您的DBA真正合作,找出有时发生此错误的原因。没有很好的理由忽略错误是一个坏主意。在一个似乎是只读查询中删除表错误?按照cdhowie的建议,检查您的查询是否存在sql注入漏洞这看起来像是sql注入,顺便说一句,为什么您要删除该表,它是临时表看起来您正在搜索一个以表开头的表。换句话说,如果存在名为table_test的表,则返回true。但随后尝试删除名为table的表。如果存在表_测试,则删除表。你明白为什么有时候会出错吗?@Cyborgx37,这对我来说有点道理。让我困惑的是,查询有时如何能够完美地运行而没有问题,有时又会导致错误?换句话说:我理解你的评论,但是怎么可能有一个表有时存在,有时不存在呢?我今天早些时候确实尝试过这个方法,它导致了以下错误:数据库中已经有一个名为“table”的对象。我不知道这是否是一个好的做法,但是,在SQL查询中使用try-catch块之后,我现在能够100%地从silverlight程序检索查询结果。这会稍微影响您的性能。此外,如果您有意外的异常,try/catch会简单地将其丢弃。但是,它是
EMS是一个罕见的问题,我个人认为它是可以接受的。你有几个其他的选择,可能更容易。特别是最后一次,我根本没有删除临时表。我尝试了不删除临时表,但仍然收到错误。是否我必须尝试删除这些表,以防其他查询将它们留下?目前我对数据库和SQL的了解还很肤浅,但我很确定这就是为什么删除临时表的if语句处于我正在处理的庞大查询的开头。