0

我正在批量执行一些 SQL 查询,然后将所有结果集批量取回。我的代码当前放在一起的方式,第一个结果集被跳过。既然我知道了这一点,我可以简单地在我的循环之外添加另一个语句来获取第一个结果,但是我想知道是否有更优雅的解决方案来解决这个问题。

这是发生了什么的一些 sudo 代码:

DbDataReader reader= /*some stuff that returns a batch of results...*/;

while (reader.NextResult())
{
   while (reader.Read())
   {
       if (!reader.IsDBNull(0))
       {
           //do things with the data....
       }
   }
}

现在我本来希望 NextResult() 在您第一次调用它时将您推进到第一个结果,这就是 Read() 似乎所做的。然而,它实际上似乎做的是在第一次通话时将您带到第二个结果。我是否误解了您应该如何使用此方法,或者您是否真的希望执行以下操作:

DbDataReader reader= /*some stuff that returns a batch of results...*/;

//this deals with the row in the the very first result
while (reader.Read())
{
    if (!reader.IsDBNull(0))
    {
        //do things with the data....
    }
}

//this deals with the rest of the rows...
while (reader.NextResult())
{
   while (reader.Read())
   {
       if (!reader.IsDBNull(0))
       {
           //do exact same things with the data....
           //is this not pretty klugey?
       }
   }
}

这让我觉得编程风格很烂,但我看不出有什么办法。有谁知道对此有更优雅的解决方案?

4

3 回答 3

9

只需将 NextResult 放在循环的末尾而不是开头:

do {
   while (reader.Read()) {
      if (!reader.IsDBNull(0)) {
         //do things with the data....
      }
   }
} while (reader.NextResult());
于 2009-04-02T16:36:10.407 回答
3

在绝大多数情况下,您将只返回一个带有任何给定调用的结果集,因此设计人员每次使用阅读器时都要求“NextResultSet”是没有意义的。

因此,如果您要提取多个结果集,您的第二个示例确实成立。但是,您的帖子让我想知道的另一件事是,如果您要检索多个结果集,为什么要对数据执行“完全相同的操作”-数据的结构不会有足够的不同,以至于您不会'不做完全相同的事情?

也就是说,您的示例让我想知道您是否在考虑数据管理功能的工作方式时没有某种错误。

于 2009-04-02T16:35:04.373 回答
0

我通常这样做:

if(reader.HasRows)
    {
      while(reader.Read())
       {

          // Do Stuff
       }
    }

希望能帮助到你

于 2009-04-02T16:37:16.973 回答