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

私はこのコードに問題がありました。適切なbool定義がnullを許可しないオペレータとして

オペレータが参照型またはnull許容タイプに使用されなければならないようザ(「ブール」は、非null許容値型である)

どのようにこの場合の適切BLOCKEDを宣言する必要がありますか?

+0

「リーダー」とは何ですか? 'DbDataReader'の派生物であれば' GetBoolean() 'と' IsDbNull() 'メソッドがあります。 –

答えて

5

あなたはその後、それをキャストし、プロパティがboolであることを確認している場合:

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

accounts.Add(account); 

それともあなたがわからない場合では、値かどうかを持っています

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

それともあなたがいる場合

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

およびReaderは、DbDataReaderされている場合:それは(NULL可能)ブール型フィールドであってもわかりませんGetBooleanを使用すると、Rene Vogtが提案されました。

補足として、命名規則を検討する必要があります。プロパティとクラスはラクダのケースにする必要がありますので、BlockedTransportToAccountになります。

+0

ありがとうございました。 – AlexanderK

+1

最初のバージョン( '(bool)reader。[...]')は、値が 'null'の場合に例外をスローします。 –

+1

合意しましたが、それは私が要件として述べた「ブール」ではなく、また質問から読むことができます。 –

2

あなたreaderDbDataReaderのいくつかの誘導体(例えばSqlDataReader)あなたはIsDbNull()GetBoolean()を使用することができている場合:IsDbNull以来

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); 

GetBooleanカラム名の代わりにパラメータとして列インデックスを使用し、あなたは」 d最初にGetOrdinalを使用してインデックスをキャッシュします。

すでに提案されているPatrickのように、命名規則を改善してください。

関連する問題