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()が実行しているように見えます。ただし、実際に行われているように見えるのは、最初の呼び出しで2番目の結果に到達することです。私はあなたがこの方法をどのように使用することが期待されているかを誤解していますか、それともあなたは本当に次のようなことをすることが期待されていますか?

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

ほとんどの場合、特定の呼び出しで返される結果セットは1つだけなので、リーダーを使用するたびにデザイナーが「NextResultSet」を要求することは意味がありません。

したがって、複数の結果セットをプルしている場合、2番目の例は確かに当てはまります。しかし、あなたの投稿が私に不思議に思うもう1つのことは、複数の結果セットを取得する場合に「データとまったく同じこと」を行う理由です。データの構造は、あなたがするほど十分に異なっていないでしょう。まったく同じことをしていませんか?

つまり、あなたの例では、データ管理機能がどのように機能するかについての考え方に何らかのバグがないかどうか疑問に思います。

于 2009-04-02T16:35:04.373 に答える
0

私は通常これを行います:

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

          // Do Stuff
       }
    }

それが役に立てば幸い

于 2009-04-02T16:37:16.973 に答える