2014-06-07 16 views
14

Sto recuperando le informazioni utente da un database utilizzando una semplice query.Come ottenere un valore in bit con SqlDataReader e convertirlo in bool?

select * from dbo.[User] u where u.Email = @email 

Allora provo ad ottenere il valore di una colonna, chiamato IsConfirmed (che è rappresentato come una colonna di tipo bit nel database) e convertirlo in bool.

bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1; 

Allora ottengo un errore FormatException, affermando che "stringa di input non era in un formato corretto.".

ho visto una domanda simile con una risposta che fornisce questo codice:

bool isConfirmed = sqlDataReader.GetBoolean(0); 

Ma questo non funzionerà con il mio caso, perché non so l'indice della colonna IsConfirmed e io no voglio saperlo. Voglio usare il nome della colonna.

risposta

16

Il valore restituito dalla proprietà dell'indicizzatore del lettore di dati è di tipo oggetto ma può essere trasmesso al tipo di dati in cui è stato memorizzato.

Prova questo:

bool isConfirmed = (bool)sqlDataReader["IsConfirmed"] 
9

Se si desidera utilizzare il nome della colonna è possibile utilizzare

bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed")); 
3

il codice dovrebbe funzionare se non si dispone di alcun valore nullo nella colonna IsConfirmed.
Di solito queste colonne di bit hanno una proprietà NOT NULL e/o un valore predefinito di 0, ma potrebbe capitare di avere un valore nullo e, in questo caso, il codice fallirà con l'errore menzionato.

Si potrebbe risolvere il problema in questo modo (è necessario avere la posizione della colonna per questa prova però)

int colPos = sqlDataReader.GetOrdinal("IsConfirmed"); 
bool isConfirmed = sqlDataReader.IsDBNull(colPos) ? false : sqlDataReader.GetBoolean(colPos)); 

Se davvero non amano avere una chiamata per trovare la posizione della colonna si potrebbe creare un metodo di estensione che si permettono di nascondere la chiamata

public static class ReaderExtensions 
{ 
    public static bool IsDBNull(this SqlDataReader reader, string colName) 
    { 
     int colPos = reader.GetOrdinal(colName); 
     return reader.IsDBNull(colPos); 
    } 
} 

e chiamarlo con

bool isConfirmed = int.Parse((sqlDataReader.IsDBNull("IsConfirmed") 
        ? "0" : sqlDataReader["IsConfirmed"].ToString())) == 1; 
+0

Questa è la risposta più completa e completa per gestire anche i casi di errore. +1 – Ant