2013-09-04 13 views
5

Hallo, ich kann nicht scheint, diese Cast-Operation zu lösen. Ich bekomme Fehler:Casting DBNull zu boolean

String not recognized as a valid boolean

für die Linie

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

Ich bin ein DataReader mit meiner Tabelle Schema zu erhalten. IsKey ist derzeit null überall in meiner DB. Ich möchte grundsätzlich ein true oder false Ergebnis.

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

Ein Null ist kein boolescher Typ. Verwenden Sie die Nullable 'bool?'. Wie auch immer, du 'ToString()' alles irgendwie, damit das immer noch nicht funktioniert. – Lloyd

+0

sollten Sie 'bool?' Verwenden –

+1

Wenn es 'DBNull.Value' ist, welchen' Bool'-Wert möchten Sie konvertieren? –

Antwort

19

Zuerst verwenden Sie dieses Format für Werte aus einer DataRow bekommen:

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

Dies definiert nachdrücklich die Rückkehr Wert und für Sie tut Konvertierung.

Ihr Problem ist, dass Sie eine Spalte haben, die ein bit ist (oder zumindest hoffe ich, dass es ein bisschen ist), aber auch nulls ermöglicht. Das bedeutet, dass der Datentyp in C# bool? ist. Verwenden Sie diese:

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

Ihre zweite Frage (in den Kommentaren):

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

Der einfachste Weg ist ein Dieses sagt Null-Coalescing Operator

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

zu verwenden: „mir geben Das erste, was nicht Null ist, entweder der Spaltenwert oder "false".

+0

Der Variablenname 'columnName' kann jemanden verwirren, der Wert ist tatsächlich nicht' columnName', sondern der Wert der Zelle in der 'row' in der Spalte 'ColumnName'. –

+0

@KingKing, einverstanden. Ich habe den ersten Artikel als Beispiel benutzt. Expanded zu beiden – gunr2171

+0

@ gunr2171 danke für Sie helfen, es war hilfreich. Noch eine Frage dazu: Wenn bool? isKey return NULL Wie kann ich das in false umwandeln? Entsprechend der Dokumentation gibt der isKey-Wert True oder False zurück, so dass ich überrascht wurde, als es eine NULL zurückgab, http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx – eetawil