在SQL中检索String字段是否有正确的方法?

4

我看到了从SQL中检索字符串字段的不同方法。是否有“正确”的方法,它们之间有什么区别?

  SqlDataReader rdr;
  1.  String field = (String) rdr["field"];
  2.  String field = rdr["field"].ToString();
  3.  String field = rdr["field"] As String;

谢谢!

5个回答

6

您也可以使用以下方法:

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

本质上,这做的是同样的事情,只不过它是类型安全的。我喜欢创建自己的IDataReader,它包装了SqlDataReader。CSLA使用了类似的机制,他们称之为SafeDataReader,因为它为所有不同的数据类型提供了重载,实现了这种模式。

如果您知道字段不会为空,可以省略isDbNull检查。由于冗长性,我建议将其放在某种包装器或助手类中,并将其制作成函数。


4
  1. 如果类型不是字符串,可能会引发异常
  2. 绝对是错误的,因为如果值为null,则可能会引发异常。
  3. 如果为空或类型不是字符串,将分配null

因此,为了安全起见 - 我会选择3。


实际上,在(2)中,它不会因为空值而引发异常。你会得到一个空字符串。 - LeJeune
但是 1. 可能会因为 null 而引发异常。 - Joel Coehoorn
实际上,如果值为空,(2)会引发一个异常——我已经遇到过这种情况。在这里,(3)绝对是最好的选择。 - John Rudy
我同意LeJeune的看法,(2)是可以的——我故意使用它来将null值吞噬为""。 - Michael Haren

2

请记住,问题与您的数据定义相互作用。如果“字段”已定义为“非空”,则无需担心空数据,并应选择#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。


1
如果我期望一个字符串,我会使用#1。如果由于某种原因该字段不是字符串或更改了类型,您至少可以通过异常机制得知。 (只是不要将其包装在try / empty catch中。)

0

我喜欢使用 ?? 运算符来检查 null 值(正如其他帖子中所讨论的)

字符串字段 = rdr["field"] as string ?? string.Empty

这应该可以工作。如果不行,那么可能已经太晚了 :P,除非你真的想要结果为 null。如果是这样,那么我喜欢 3。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接