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