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

我对此代码有问题。正确的布尔定义为不可为空的运算符

的作为操作者必须与参考类型或空类型被使用(“布尔”是一个非空值类型)

我应该如何正确声明BLOCKED在这种情况下?

+0

什么是'reader'?如果它是'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 ,您可以使用GetBoolean,因为建议使用Rene Vogt

作为一个方面说明:你应该遵守你的命名约定。属性和类应该是骆驼案件,所以它将是BlockedTransportToAccount

+0

谢谢,看起来正确。 – AlexanderK

+1

请注意,如果值为null,则第一个版本('(bool)reader。[...]')将引发异常。 –

+1

同意,但它不是'bool',我将其作为要求陈述,也可以从该问题中读取。 –

2

如果您readerDbDataReader某些衍生物(例如SqlDataReader),你可以使用IsDbNull()GetBoolean()

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

由于IsDbNullGetBoolean使用列索引作为参数,而不是列名,你” d首先要使用GetOrdinal缓存索引。

并且已经建议Patrick,请尝试改进您的命名约定。