2013-09-04 24 views
5

Hello Non riesco a risolvere questa operazione di cast. Ottengo l'errore:Casting DBNull to boolean

String not recognized as a valid boolean

per la linea

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

sto usando un DataReader per ottenere il mio tavolo Schema. IsKey è attualmente null ovunque nel mio DB. Fondamentalmente voglio un risultato true o 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

Un null non è un tipo booleano, usa nullable 'bool?'. Comunque tu 'ToString()' tutto comunque così che comunque non funzionerà. – Lloyd

+0

dovresti usare 'bool?' –

+1

Se è 'DBNull.Value', quale valore' bool' vuoi convertire? –

risposta

19

In primo luogo, utilizzare questo formato per ottenere i valori da una DataRow:

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

Questo definisce con forza il valore di ritorno e fa la conversione per voi.

Il tuo problema è che si dispone di una colonna che è un bit (o almeno spero che sia un po '), ma consente anche nulls. Ciò significa che il tipo di dati in C# è un bool?. Utilizzare questa:

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

tua seconda domanda (nei commenti):

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

Il modo più semplice è quello di utilizzare un Null-Coalescing Operator

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

Questo dice: "Dammi prima cosa che non è nullo, o il valore della colonna o "falso".

+0

il nome della variabile 'columnName' può rendere qualcuno confuso, il valore infatti non è' columnName' è il valore della cella sulla 'riga' nella colonna' ColumnName'. –

+0

@KingKing, d'accordo. Stavo usando il primo elemento come esempio. Espansione per entrambi – gunr2171

+0

@ gunr2171 grazie per il tuo aiuto è stato utile. Un'altra domanda su questo: se bool? isKey restituisce NULL come posso convertirlo in falso? Secondo la documentazione, il valore isKey restituisce True o False, quindi sono rimasto sorpreso quando ha restituito un NULL, http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx – eetawil