我看到了从SQL中检索字符串字段的不同方法。是否有“正确”的方法,它们之间有什么区别?
SqlDataReader rdr;
1. String field = (String) rdr["field"];
2. String field = rdr["field"].ToString();
3. String field = rdr["field"] As String;
谢谢!
您也可以使用以下方法:
int ordinal=rdr.GetOrdinal("stringField");
if (rdr.IsDBNull(ordinal))
{
return string.Empty; //Or null or however you want to handle it
}
else
{
rdr.GetString(ordinal);
}
public override object this[string name]
{
get
{
return this.GetValue(this.GetOrdinal(name));
}
}
本质上,这做的是同样的事情,只不过它是类型安全的。我喜欢创建自己的IDataReader,它包装了SqlDataReader。CSLA使用了类似的机制,他们称之为SafeDataReader,因为它为所有不同的数据类型提供了重载,实现了这种模式。
如果您知道字段不会为空,可以省略isDbNull检查。由于冗长性,我建议将其放在某种包装器或助手类中,并将其制作成函数。
因此,为了安全起见 - 我会选择3。
请记住,问题与您的数据定义相互作用。如果“字段”已定义为“非空”,则无需担心空数据,并应选择#1以获得可读性。同样,如果该字段可为空,但在查询时使用了“IsNull”函数:
Select IsNull(Field1, '') as Field1 From DBTable Where...
再次强调,你应该选择#1,因为你仍然不必担心null值。当然,这假定你希望将null值掩盖为空字符串。如果你想测试null值是否为错误条件,那么你需要像这样编写逻辑:
if (nwReader.IsDBNull(nwReader.GetOrdinal("Field1")))
*throw exception or otherwise handle null condition
string aStr = (string)nwReader["field"];
然而,最后一种情况并不是一个好的实践。如果null是无效值-即错误条件-那么你应该在DDL中排除它。
尽管如此,我总是选择选项#1,因为我认为它会导致更好的可读性,并且它强制我明确地处理null。
我喜欢使用 ?? 运算符来检查 null 值(正如其他帖子中所讨论的)
字符串字段 = rdr["field"] as string ?? string.Empty
这应该可以工作。如果不行,那么可能已经太晚了 :P,除非你真的想要结果为 null。如果是这样,那么我喜欢 3。