2013-01-07 15 views
17

Cercando di vedere se è utile aggiungere un if (dr.HasRows) prima della funzione while (dr.read()). Voglio dire, tecnicamente se non ha righe che non leggerà, quindi sarebbe importante se lo avessi controllato prima?Dovrebbe se chiama SqlDataReader.HasRows se sto chiamando SqlReader.Read

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

o è questa intenzione di fare essenzialmente la stessa cosa, se si sta solo facendo attenzione che ha valori per fornire ...

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

Sarebbe utile se esistesse un'altra clausola sul if. Vuoi una gestione speciale se non ci sono file? –

risposta

13

No..Non è obbligatorio controllare (dr.HasRows) se il DataReader contiene una riga o meno.

Read() tornerà False se non ci sono più righe per recuperare, ma Reader.HasRows è molto più eloquente di ciò che fa di Read() quindi sarebbe una buona pratica da usare Reader.HasRows perché si potrebbe accidentalmente fare qualcosa di diverso da Read() che potrebbe cadere in eccezione.

+10

Fai attenzione con HasRows poiché potrebbe restituire false quando Read() ** restituirà SqlException ** ad es. perché c'è un errore nel tuo SQL o c'è una violazione dei vincoli di dati su Inserisci, ecc. Di solito devi sapere se non ci sono davvero solo righe o c'è un errore. –

+2

@IvanAkcheurov è corretto. Oltre ai suoi esempi, l'essere selezionato come vittima di deadlock non sarà conosciuto semplicemente usando HasRows - SqlException non viene lanciato finché Read() non viene richiamato. – alexg

+0

Questi due commenti alla fine cambiano quella che dovrebbe essere la "buona pratica", cioè non cortocircuitare 'Read()' con 'HasRows()'. Per questo motivo, sto votando la risposta. –

1

penso che questo è per lo più per le stored procedure che possono o potrebbe non avere dati (uno o più set di risultati) ed è "più facile" controllare per primo nel caso in cui facciate anche altre cose rispetto al ciclo while (cioè inizializzate header/footer ecc. quando ci sono dati).

2

Non è obbligatorio controllare se DataReader ha righe (dr.HasRows). Il metodo Read() restituirà true se ci sono più dati da leggere e false se non ci sono più dati, interrompendo così il ciclo while.

-4

provare

  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; 
       } 
      } 

tua opinione richiesto

+0

Dichiarare le variabili nel sito di primo utilizzo e utilizzare le istruzioni 'using'. Downvoted. –

5

Fate attenzione. HasRows() restituisce false per la mia query CTE, anche se ci sono righe (437 righe in realtà).