2009-07-18 12 views
56
private void button1_Click(object sender, EventArgs e) 
    { 
     string name; 
     name = textBox5.Text; 
     SqlConnection con10 = new SqlConnection("con strn"); 
     SqlCommand cmd10 = new SqlCommand("select * from sumant where [email protected]"); 
     cmd10.Parameters.AddWithValue("@name",name); 
     cmd10.Connection = con10; 
     cmd10.Connection.Open();//line 7 
     SqlDataReader dr = cmd10.ExecuteReader(); 
    } 

    if (textBox2.Text == dr[2].ToString()) 
    { 
     //do something; 
    } 

non ci sono dati Quando metto a punto fino a quando la linea 7, è ok, ma dopo che il dottor genera un'eccezione: Invalid attempt to read when no data is present. Questo non è possibile in quanto io ho dati nella tabella con username = Sumant. Ti prego, dimmi se il 'se' affermazione è corretta o no .........valido tentativo di leggere quando è presente

E come faccio a rimuovere l'errore ??

risposta

128

devi chiamare DataReader.Read per andare a prendere il risultato:

SqlDataReader dr = cmd10.ExecuteReader(); 
if (dr.Read()) 
{ 
    // read data for first record here 
} 

DataReader.Read() restituisce un bool indica se ci sono più blocchi di dati da leggere, quindi se avete più di 1 risultato, si può fare:

while (dr.Read()) 
{ 
    // read data for each record here 
} 
+4

oltre a questo, si potrebbe desiderare di provare per i dati siano nulli utilizzando dr.IsBDNull (0) –

+0

Questa risposta può essere migliorato, il primo frammento di non prendersi cura del restituisce il valore di 'dr.Read()'. Pertanto, se la query non restituisce record, l'errore è lo stesso: "Tentativo non valido di leggere quando non sono presenti dati". Usa invece 'if (dr.Read()) {....}' (o un ciclo come sotto). –

13

È necessario chiamare dr.Read() prima di tentare di leggere qualsiasi dato. Questo metodo restituirà false se non c'è nulla da leggere.

6

vorrei controllare per vedere se lo SqlDataReader ha righe restituite prima:

SqlDataReader dr = cmd10.ExecuteReader(); 
if (dr.HasRows) 
{ 
    ... 
} 
+0

nel mio caso ho avuto questo, e anche se ho usato altrove, in questo particolare scenario che ha prodotto questo errore, questo NON ha fermato l'errore di ribollire. La mia query risultante ha righe, eppure il lettore non ha dati. Io davvero non capisco cosa sta succedendo. Ho verificato personalmente la query e i parametri. – Barry

6

Ho appena avuto questo errore, stavo chiamando dr.NextResult() invece di dr.Read().

+1

ha appena avuto la stessa identica cosa! E 'stata un'ora frustrante! –

1

Ho usato il codice qui sotto e ha funzionato per me.

String email=""; 
    SqlDataReader reader=cmd.ExecuteReader(); 
    if(reader.Read()){ 
     email=reader["Email"].ToString(); 
    } 

String To=email; 
0

Avevo 2 valori che potrebbero contenere valori nulli.

while(dr.Read()) 
{ 
    Id = dr["Id"] as int? ?? default(int?); 
    Alt = dr["Alt"].ToString() as string ?? default(string); 
    Name = dr["Name"].ToString() 
} 

risolto il problema

Problemi correlati