2012-05-03 10 views
35

Sto tentando di eseguire una stored procedure e quindi utilizzare un'istruzione if per verificare i valori nulli e sto arrivando a breve. Sono un ragazzo VB quindi ti prego di stare con me se sto facendo un errore di sintassi da scolaro.DBNull if statement

objConn = new SqlConnection(strConnection); 
objConn.Open(); 
objCmd = new SqlCommand(strSQL, objConn); 
rsData = objCmd.ExecuteReader(); 
rsData.Read(); 

if (!(rsData["usr.ursrdaystime"].Equals(System.DBNull.Value))) 
     { 
      strLevel = rsData["usr.ursrdaystime"].ToString(); 

     } 

Sarebbe questo mi permetterà di verificare se la connessione SQL sta tornando solo un valore e se è così allora che popolano la mia stringa?

io sono abituato ad essere in grado di controllare solo il qui sotto per vedere se un valore viene restituito e non sono sicuro che sto facendo correttamente con C#

Se non IsDBNull (rsData ("usr.ursrdaystime"))

Qualsiasi aiuto sarebbe apprezzato!

+3

se vi aspettate una cella, si consideri 'ExecuteScalar' –

+0

Non mettere il linguaggio di programmazione nel titolo della tua domanda - questo è ciò che i tag sono per. –

+0

Ci scusiamo - lo annoterò per il futuro @DBM. – PipBoy

risposta

58

Questo dovrebbe funzionare.

if (rsData["usr.ursrdaystime"] != System.DBNull.Value)) 
{ 
    strLevel = rsData["usr.ursrdaystime"].ToString(); 
} 

anche bisogno di aggiungere istruzione using, come muggito:

using (var objConn = new SqlConnection(strConnection)) 
    { 
     objConn.Open(); 
     using (var objCmd = new SqlCommand(strSQL, objConn)) 
     { 
      using (var rsData = objCmd.ExecuteReader()) 
      { 
       while (rsData.Read()) 
       { 
       if (rsData["usr.ursrdaystime"] != System.DBNull.Value) 
       { 
        strLevel = rsData["usr.ursrdaystime"].ToString(); 
       } 
       } 
      } 
     } 
    } 

questo sarà automaticly Dispose (chiudi) risorse al di fuori del blocco {..}.

+0

L'istruzione using sostituisce le mie stringhe di connessione iniziali? Suppongo che sostituisca il seguente objConn = new SqlConnection (strConnection); objConn.Open(); Userei ancora le stringhe objCmd e rsdata? – PipBoy

+0

Ho modificato il codice - aggiunta corretta usando le istruzioni (che chiudono/dispongo) la connessione. Hai ancora bisogno di ** aprire ** connessione –

+0

Penso che in questo caso questo si adatta meglio alle mie esigenze - grazie! – PipBoy

9

Il modo idiomatica è dire:

if(rsData["usr.ursrdaystime"] != DBNull.Value) { 
    strLevel = rsData["usr.ursrdaystime"].ToString(); 
} 

questo:

rsData = objCmd.ExecuteReader(); 
rsData.Read(); 

lo fa apparire come stai leggendo esattamente un valore. Utilizzare invece IDbCommand.ExecuteScalar.

2

Sì, solo un problema di sintassi. Prova a modificare:

if (reader["usr.ursrdaystime"] != DBNull.Value) 

.Equals() sta controllando per vedere se two Object instances are the same.

+1

Questo lo porterà in condizione. Rendi '==' a '! =' –

+0

Sì, l'ho notato dopo averlo pubblicato. Ora corretto. – mgnoonan

2

considerare:

if(rsData.Read()) { 
    int index = rsData.GetOrdinal("columnName"); // I expect, just "ursrdaystime" 
    if(rsData.IsDBNull(index)) { 
    // is a null 
    } else { 
    // access the value via any of the rsData.Get*(index) methods 
    } 
} else { 
    // no row returned 
} 

anche: avete bisogno di più using; p

-1

Al primo utilizzo ExecuteScalar

objConn = new SqlConnection(strConnection); 
objConn.Open(); 
objCmd = new SqlCommand(strSQL, objConn); 
object result = cmd.ExecuteScalar(); 
if(result == null) 
    strLevel = ""; 
else 
    strLevel = result.ToString(); 
2

L'equivalente più vicino alla tua VB sarebbe (see this):

Convert.IsDBNull() 

Ma ci sono una serie di modi per farlo, e la maggior parte sono legati from here

0

Io uso spesso String.IsNullorEmpty . Funzionerà perché quando DBNull è impostato su .ToString restituisce vuoto.

if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){ 
     strLevel = rsData["usr.ursrdaystime"].toString(); 
    }