2014-06-07 39 views
14

Pobieranie informacji o użytkowniku z bazy danych za pomocą prostego zapytania.Jak uzyskać niewielką wartość za pomocą SqlDataReader i przekonwertować go na wartość bool?

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

I spróbuj uzyskać wartość w kolumnie o nazwie IsConfirmed (który jest reprezentowany jako kolumna typu bit w bazie danych) i przekształcić ją w bool.

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

Następnie otrzymuję błąd FormatException, stwierdzając, że "Ciąg wejściowy nie był w poprawnym formacie.".

widziałem podobne pytanie z odpowiedzią zapewniając ten kod:

bool isConfirmed = sqlDataReader.GetBoolean(0); 

Ale to nie będzie działać z moim przypadku, ponieważ nie wiem, indeks kolumny IsConfirmed a ja nie chcę to wiedzieć. Chcę użyć nazwy kolumny.

Odpowiedz

16

Wartość zwrócona z właściwości indekserów czytnika danych jest typu obiekt, ale może być rzutowana na typ danych, w którym został zapisany.

Spróbuj tego:

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

Jeśli chcesz użyć nazwy kolumny można użyć

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

Twój kod powinien działać, jeśli nie mają żadnego wartość null w kolumnie IsConfirmed.
Zazwyczaj te kolumny bitów mają właściwość NOT NULL i/lub wartość domyślną 0, ale może się zdarzyć, że będą miały wartość pustą, a w tym przypadku kod zakończy się niepowodzeniem z wymienionym wyżej błędem.

Można go naprawić w ten sposób (Musisz pozycję kolumny dla tej kontroli jednak)

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

Jeśli naprawdę nie lubią mieć telefon, aby znaleźć stanowisko kolumny można utworzyć metodę rozszerzenia, które pozwalają na hide połączeń

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

i nazywają go

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

Jest to najbardziej dokładna i kompletna odpowiedź, aby poradzić sobie również z przypadkami błędów. +1 – Ant