【问题标题】:Is there a right way to retrieve a String field in SQL是否有正确的方法来检索 SQL 中的字符串字段
【发布时间】: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;

谢谢!

【问题讨论】:

    标签: c# sql


    【解决方案1】:

    你也可以使用:

    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 检查。由于冗长,我建议将它放在某种类型的包装器或帮助器类中,并用它们制作函数。

    【讨论】:

      【解决方案2】:
      1. 如果类型不是字符串可能会导致异常
      2. 肯定是错误的,因为如果值为空,则可能引发异常。
      3. 如果它为 null 或者它的类型不是字符串,则将分配 null

      所以,为了安全起见 - 我会选择 3。

      【讨论】:

      • 实际上在(2)中它不会引发空异常。你得到一个空字符串。
      • 但是1.可以为null引发异常。
      • 实际上,(2) 将在值为 null 时引发异常——去过那里,做到了。 (3) 这里绝对是最好的。
      • 我同意 LeJeune 的观点 (2) 没问题——我故意用它来将空值作为 ""
      【解决方案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 处理。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我喜欢 ??用于检查空值的运算符(如其他帖子中所述)

          String field = rdr["field"] As String ??字符串.空

          这应该可行。如果没有,那就晚了:P,除非你真的希望结果为空。如果是这样,那么我喜欢 3。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-26
            • 2022-08-07
            • 2012-01-21
            • 1970-01-01
            • 2020-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多