2009-01-02 47 views
4

我已经看到不同的方式从SQL中检索字符串字段。有没有“正确”的方式,有什么区别有没有正确的方法来检索SQL中的字符串字段

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

谢谢!如果类型是不串

  • 肯定是不对的,因为如果该值为空,可能引发异常

  • 回答

    4
    1. 可能会导致异常。
    2. 将指派空,如果为空,或者如果它是不是字符串其它类型的

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

    +0

    其实在(2)它不会引发null的异常。你得到一个空字符串。 – LeJeune 2009-01-02 20:41:05

    1

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

    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的[“字段”]的样子:

    public override object this[string name] 
    { 
        get 
        { 
         return this.GetValue(this.GetOrdinal(name)); 
        } 
    } 
    

    基本上这是做同样的事情,只是它的类型安全。我喜欢做的是创建我自己的包装SqlDataReader的IDataReader。 CSLA使用一种称为SafeDataReader的simillar机制,因为它为所有实现此模式的各种数据类型提供重载。

    如果您知道该字段不为空,您可以省略isDbNull检查。由于冗长,我建议把它放在某种类型的包装器或帮助器类中,并使它们不起作用。

    2

    请记住,该问题与您的数据定义相互作用。如果“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,因为我认为它导致了更好的可读性,并迫使我明确地使用空处理。

    0

    我喜欢?? (如其他帖子中所讨论的)

    String field = rdr [“field”] As String ?? string.Empty

    这应该有效。如果没有,那么晚了:P,除非你真的想要结果为空。如果是这样,那么我喜欢3.

    相关问题