代码之家  ›  专栏  ›  技术社区  ›  LeJeune

是否有正确的方法来检索SQL中的字符串字段

  •  4
  • LeJeune  · 技术社区  · 16 年前

    我看到了从SQL检索字符串字段的不同方法。有“正确”的方法吗?有什么区别

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

    谢谢!

    5 回复  |  直到 16 年前
        1
  •  6
  •   JoshBerke    16 年前

    您还可以使用:

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

        2
  •  4
  •   Otávio Décio    16 年前
    1. 如果类型不是字符串,则可能导致异常
    2. 绝对是错误的,因为如果值为空,则可能引发异常。
    3. 如果为空或不是字符串类型,则将分配空

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

        3
  •  2
  •   Mark Brittingham    16 年前

    请记住,问题与数据定义相互作用。如果“field”被定义为“Not Null”,那么您不必担心空数据,应该选择1作为可读性。类似地,如果字段可以为空,但在执行查询时使用“IsNull”函数:

    Select IsNull(Field1, '') as Field1 From DBTable Where...
    

    然后,同样,您应该选择1,因为您仍然不必担心空值。当然,这假设您希望空字符串屏蔽空值。如果您想测试null,因为它是一个错误条件,那么您应该具有如下逻辑:

    if (nwReader.IsDBNull(nwReader.GetOrdinal("Field1")))
        *throw exception or otherwise handle null condition
    string aStr = (string)nwReader["field"];
    

    然而,最后一个案例并不是很好的实践。如果null是一个无效值(一个错误条件),那么您应该在DDL中排除它。

    不过,最后,我总是选择选项1,因为我认为它会带来更好的可读性,并迫使我将空处理显式化。

        4
  •  1
  •   Greg    16 年前

    如果我想要一根绳子,我就做1。如果由于某种原因该字段不是字符串或更改类型,您至少可以通过异常机制了解它。 (不要把它包装在try/empty catch中。)

        5
  •  0
  •   Ben Dempsey    16 年前

    我喜欢那个??检查零位的操作员(如其他岗位所述)

    String field=rdr[“field”]作为字符串??字符串。空

    这应该管用。如果不是,那么就晚了:P,除非你真的希望结果为空。如果是的话,我喜欢3。