var account = new TRANSPORT_TO_ACCOUNT
{
TransportLayerId = reader["ID"] as string,
...
BLOCKED = reader["BLOCKED"] as bool,
};
accounts.Add(account);
我的代码存在问题。
as运算符必须与引用类型或可空类型一起使用('bool'是不可为空的值类型)
在这种情况下,如何正确声明BLOCKED
?
答案 0 :(得分: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?
如果读者是DbDataReader
,则可以GetBoolean
使用Blocked
。
作为旁注:您应该遵循命名约定。属性和类应该是驼峰案例,因此它应为TransportToAccount
和<head>
。
答案 1 :(得分:2)
如果您的reader
是DbDataReader
的某个衍生物(例如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);
由于IsDbNull
和GetBoolean
使用列索引作为参数而不是列名,因此您首先要使用GetOrdinal
来缓存索引。
正如Patrick已经建议的那样,请尝试改进您的命名约定。