2016-07-14 8 views
0
var account = new TRANSPORT_TO_ACCOUNT 
{ 
    TransportLayerId = reader["ID"] as string, 
    ... 
    BLOCKED = reader["BLOCKED"] as bool, 
}; 
accounts.Add(account); 

Ich hatte ein Problem mit diesem Code.Richtige Bool-Definition als nicht Nullable-Operator

Die als Betreiber muss mit einem Referenztyp oder Nullable-Typ verwendet werden (‚Bool‘ ist ein Nicht-Nullable-Wertetyp)

Wie soll ich die BLOCKED richtig in diesem Fall erklären?

+0

Was ist 'Leser'? Wenn es ein Derivat von 'DbDataReader' ist, hat es eine' GetBoolean() 'und eine' IsDbNull() 'Methode, die Sie verwenden könnten. –

Antwort

5

Wenn Sie sicher sind Eigentum ein bool ist, dann ist es nur Stimmen:

var account = new TRANSPORT_TO_ACCOUNT 
       { TransportLayerId = (string)reader["ID"] 
       , BLOCKED = (bool)reader["BLOCKED"] 
       }; 

accounts.Add(account); 

Oder wenn Sie nicht sicher sind, ist es, einen Wert hat oder nicht:

, BLOCKED = (bool?)reader["BLOCKED"] 

Oder wenn Sie nicht einmal sicher, ob es sich um eine (nullable) boolean Feld:

, BLOCKED = reader["BLOCKED"] as bool? 

Und wenn Leser ist ein DbDataReader könnten Sie GetBoolean verwenden, wie Rene Vogt vorgeschlagen.

Als Randnotiz: Sie sollten an Ihren Namenskonventionen arbeiten. Eigenschaften und Klassen sollten Camel Cases sein, also wäre es Blocked und TransportToAccount.

+0

Danke, sieht gut aus. – AlexanderK

+1

Beachten Sie, dass die erste Version ('(bool) reader. [...]') eine Ausnahme auslöst, wenn der Wert 'null' ist. –

+1

Einverstanden, aber es ist kein 'bool', was ich als Anforderung angegeben habe und auch aus der Frage abgelesen werden kann. –

2

Wenn Ihre reader einige derivate von DbDataReader (zum Beispiel einen SqlDataReader) Sie IsDbNull() und GetBoolean() verwenden:

int blockedIndex = reader.GetOrdinal("BLOCKED"); 
var account = new TRANSPORT_TO_ACCOUNT 
{ 
    TransportLayerId = reader["ID"] as string, 
    ... 
    BLOCKED = reader.IsDbNull(blockedIndex) 
       ? (bool?)null 
       : reader.GetBoolean(blockedIndex) 
}; 
accounts.Add(account); 

Seit IsDbNull und GetBoolean verwenden, um den Spaltenindex als Parameter anstelle des Spaltennamen, Sie‘ d möchte den Index zuerst mit GetOrdinal zwischenspeichern.

Und als Patrick bereits vorgeschlagen, versuchen Sie, Ihre Namenskonventionen zu verbessern.

Verwandte Themen