2013-01-07 39 views
17

while (dr.read())関数の前にif (dr.HasRows)を追加すると効果的かどうか試してみてください。つまり、技術的には行がない場合は読み込めないので、最初にチェックしても問題ありませんか?SqlReader.Readを呼び出す場合はSqlDataReader.HasRowsを呼び出す必要があります

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 
    } 
}  
+2

if節にelse節があると便利です。行がない場合は特別な処理をしますか? –

答えて

13

いいえ。(dr.HasRows)には、DataReaderに行が含まれているかどうかを確認する必要はありません。

Read()Read()よりも、そこにフェッチするもう行はありませんが、Reader.HasRowsは、はるかにそれが何にとして語っているのであれば、それはあなたが誤って可能性があるためReader.HasRowsを使用する良い練習になりを返します。例外になるかもしれないRead()以外の何かをしてください。

+10

Read()**がSqlException **を返すときにfalseを返す可能性があるので、HasRowsに注意してください。あなたのSQLにエラーがあるか、またはInsertなどのデータ制約に違反しているためです。通常、実際に行がないか、エラーがあるかどうかを知る必要があります。 –

+2

@IvanAkcheurovが正しいです。彼の例に加えて、デッドロックの犠牲者として選択されるのは、HasRowsを使うだけではわかりません.SqlExceptionは、Read()が呼び出されるまでスローされません。 – alexg

+0

これらの2つのコメントは最終的に "良い習慣"であるべきもの、すなわち 'Read()'を 'HasRows()'と短絡させないように変更します。この理由から、私は答えを投票しています。 –

1

私は、これはこれかもしれストアド・プロシージャのほとんどだと思いますデータ(1つ以上の結果セット)を持たない場合や、whileループ以外のもの(データがある場合はヘッダ/フッタなどの初期化)を行う場合に最初にチェックする方が簡単です。

2

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

-4

  string myconnection = "datasource= localhost;port=3306;username=root;password=root;"; 
      MySqlConnection myconn = new MySqlConnection(myconnection); 

      //MySqlDataAdapter mydata = new MySqlDataAdapter(); 
      MySqlDataReader myreader; 

      MySqlCommand SelectCommand = new MySqlCommand("select *from student_info.student_info where username= '" + textBox1.Text +" 'and password=' " + textBox2.Text +"';",myconn); 


      myconn.Open(); 

      myreader = SelectCommand.ExecuteReader(); 
      int count = 0; 
      if (myreader.HasRows) //returing false but i have 4 row 
      { 
       while (myreader.Read()) //returing false 
       { 
        MessageBox.Show("in button3"); 
        count = count + 1; 
       } 
      } 

あなたの意見は

+0

最初に使用する場所で変数を宣言し、 'using'ステートメントを使用してください。 Downvoted。 –

5

ように注意してくださいを必要としてみてください。 HasRows()はCTEクエリに対してfalseを返しますが、実際には行が437行あります。

関連する問題