2009-01-02 50 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.

    相關問題