web-dev-qa-db-ja.com

SqlReader.Readを呼び出す場合、SqlDataReader.HasRowsを呼び出す必要があります

if (dr.HasRows)関数の前にwhile (dr.read())を追加することが有益かどうかを確認しようとしています。技術的には、行がない場合は読み込めないので、これを最初にチェックしても問題ないでしょうか?

using (SqlDataReader dr = cmd.ExecuteReader())
{
    if (dr.HasRows)
    {
        while (dr.Read())
        {
            ....do stuff here
        }
    }
}

または、提供する値があることを確認している場合、これは本質的にまったく同じことを行います...

using (SqlDataReader dr = cmd.ExecuteReader())
{
    while (dr.Read())
    {
        ....do stuff here
    }
}    
21
Joshua Volearix

いいえ。DataReaderに行が含まれているかどうかにかかわらず、_(dr.HasRows)_を確認することは必須ではありません。

Read()は、フェッチする行がもうない場合はFalseを返しますが、_Reader.HasRows_はRead()ですので、グッドプラクティス_Reader.HasRows_を使用するのは例外に陥る可能性のあるRead()以外の何かを誤って行う可能性があります。

14
Vishal Suthar

注意してください。 HasRows()は、行(実際には437行)があるにもかかわらず、CTEクエリに対してfalseを返します。

5
Chalky

DataReaderに行(dr.HasRows)があるかどうかを確認することは必須ではありません。 Read()メソッドは、読み取るデータがさらにある場合はtrueを返し、データがもうない場合はfalseを返すため、whileループが中断されます。

2
Abbas

これは主にデータ(1つまたは複数の結果セット)を持つ場合と持たない場合があるストアドプロシージャであり、whileループ以外の処理(ヘッダー/フッターの初期化など)を行う場合は、最初に確認する方が「簡単」です。データがある場合)。

1
TomTom