【发布时间】:2009-01-02 20:33:34
【问题描述】:
我已经看到了从 SQL 中检索字符串字段的不同方法。有没有“正确”的方式,有什么区别
SqlDataReader rdr;
1. String field = (String) rdr["field"];
2. String field = rdr["field"].ToString();
3. String field = rdr["field"] As String;
谢谢!
【问题讨论】:
我已经看到了从 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);
}
如果你看一下 SQlDataReader["field"] 的定义,看起来是这样的:
public override object this[string name]
{
get
{
return this.GetValue(this.GetOrdinal(name));
}
}
本质上这是在做同样的事情,只是它是类型安全的。我喜欢做的是创建我自己的包装 SqlDataReader 的 IDataReader。 CSLA 使用他们称为 SafeDataReader 的类似机制,因为它为实现此模式的所有各种数据类型提供重载。
如果您知道该字段不会为空,则可以省略 isDbNull 检查。由于冗长,我建议将它放在某种类型的包装器或帮助器类中,并用它们制作函数。
【讨论】:
所以,为了安全起见 - 我会选择 3。
【讨论】:
请记住,问题与您的数据定义相互作用。如果“字段”被定义为“非空”,那么您不必担心空数据,应该选择#1 以提高可读性。同样,如果该字段可以为空,但您在查询时使用了“IsNull”函数:
Select IsNull(Field1, '') as Field1 From DBTable Where...
然后,您应该再次选择 #1,因为您仍然不必担心 null。当然,这假设您希望空值被空字符串屏蔽。如果您想针对 null 进行测试,因为它是一个错误条件,那么您的逻辑如下:
if (nwReader.IsDBNull(nwReader.GetOrdinal("Field1")))
*throw exception or otherwise handle null condition
string aStr = (string)nwReader["field"];
然而,最后一种情况并不是很好的做法。如果 null 是一个无效值 - 一个错误条件 - 那么你应该在你的 DDL 中排除它。
不过,最后,我总是选择选项 #1,因为我认为它会带来更好的可读性,并且它迫使我明确我的 null 处理。
【讨论】:
如果我期待一个字符串,我会执行 #1。如果由于某种原因该字段不是字符串或更改类型,您至少可以通过异常机制了解它。 (只是不要将它包装在 try / empty catch 中。)
【讨论】:
我喜欢 ??用于检查空值的运算符(如其他帖子中所述)
String field = rdr["field"] As String ??字符串.空
这应该可行。如果没有,那就晚了:P,除非你真的希望结果为空。如果是这样,那么我喜欢 3。
【讨论】: