2013-09-04 13 views
5

Witam Nie mogę rozwiązać tej operacji obsady. Otrzymuję błąd:Casting DBNull na boolean

String not recognized as a valid boolean

dla linii

isKey = Convert.ToBoolean(row["IsKey"].ToString()); 

Używam DataReader aby mój tabeli schematu. IsKey jest obecnie null wszędzie w moim DB. Zasadniczo chcę uzyskać wynik true lub false.

tableSchema = myReader.GetSchemaTable();  

foreach (DataRow row in tableSchema.Rows) 
{ 
    string columnName = row["ColumnName"].ToString(); 
    string columnType = row["DataTypeName"].ToString();    
    bool isKey = Convert.ToBoolean(row["IsKey"].ToString()); 
+1

Wartość null nie jest typem boolowskim, użyj wartości pustej 'bool?'. Jednak ty 'ToString()' wszystko tak, aby nadal nie działa. – Lloyd

+0

powinieneś użyć 'bool?' –

+1

Jeśli to 'DBNull.Value', jaką wartość' bool' chcesz przekonwertować? –

Odpowiedz

19

pierwsze, należy użyć tego formatu do uzyskania wartości z DataRow:

string columnName = row.Field<string>("ColumnName"); 
string columnType = row.Field<string>("DataTypeName"); 
//this uses your first and second variable call as an example 

Ten silnie definiuje wartość powrót i robi konwersję.

Twój problem polega na tym, że masz kolumnę, która jest bit (lub przynajmniej mam nadzieję, że jest trochę), ale także pozwala na nulls. Oznacza to, że typem danych w języku C# jest bool?. Użyj tego:

bool? isKey = row.Field<bool?>("IsKey"); 

drugiego pytania (w komentarzach):

if bool? isKey return NULL how can I convert that to false?

Najprostszym sposobem jest użycie Null-Coalescing Operator

bool isKey = row.Field<bool?>("IsKey") ?? false; 

ten mówi: „daj mi pierwsza rzecz, która nie jest pusta, albo wartość kolumny, albo "fałsz"

+0

Nazwa zmiennej 'columnName' może sprawić, że ktoś pomyli się, wartość w rzeczywistości nie jest' columnName' jest to wartość komórki w 'wierszu' w kolumnie' ColumnName'. –

+0

@KingKing, zgodził się. Użyłem pierwszego elementu jako przykładu. Rozszerzony do – gunr2171

+0

@ gunr2171 dziękuję za pomoc, to było pomocne. Kolejne pytanie: czy bool? isKey zwraca NULL w jaki sposób mogę przekonwertować to na false? Zgodnie z dokumentacją wartość isKey zwraca True lub False, więc zostałem zaskoczony, gdy zwrócono wartość NULL, http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx – eetawil