2009-01-13 117 views
0

當處理諸如System.Data.Odbc或System.Data.OracleClient這樣的名稱空間時,各種數據讀取器方法通常要求提供一個對應於列的整數(例如OracleDataReader.GetInt32)。什麼是文檔數據讀取器方法調用的最佳方式?

我的問題是這樣的,使用這些函數的最好方法是什麼,以便代碼相當自我記錄。現在,在我看來,有三個選項,分別是:

// Option One - Just provide the integer value 
string myString = oraData.GetString[0]; 

// Option Two - Provide the integer value using a constant 
string myString = oraData.GetString[FIELD_NAME]; 

// Option Three - Provide the column name and use System.Convert to return the correct value 
string myString = Convert.ToString(oraData["Field_Name"]); 

每種技術似乎有自己的優點和缺點,我很好奇,看看別人怎麼想,或者如果有一個更好的方式來做到這一點。

回答

1

我同意安德魯野兔,增加,我已經封閉功能,但其簡化了操作一個重載的擴展方法:

public static string GetStringByName(this OracleDataReader reader, 
            string columnName, 
            string defaultValue) 
{ 
    string result = defaultValue; 
    int columnIndex = reader.GetOrdinal(columnName); 
    if(!reader.IsDbNull(columnName) 
    { 
     result = (string) reader.GetString(columnIndex); 
    } 
    return result; 
} 

反正只是一個重構,幫助我極大。

1

我通常使用選項3.我喜歡它,因爲如果底層查詢更改了列順序,它仍然可以正常工作,並且它顯示了您要求的名稱而不是一些幻數。

但是,我使用了很多VB.Net,所以Convert.ToString()部分可以隱式完成。 C#類型可能有不同的偏好。

此外,使用字段名稱而非列序號的罰款非常小。我通常覺得這是合理的,但根據您的應用程序,您可能需要考慮這一點。

2

我一直這樣做的話吧:

int columnIndex = dataReader.GetOrdinal("field"); 

if (!dataReader.IsDBNull(columnIndex)) 
    String myString = dataReader.GetString(columnIndex); 

的想法是,將GetOrdinalIndexOutOfRangeException當我試圖讓一個字段是不是在讀者失敗。我想要這個異常,因爲它很快告訴我,我的代碼和我的數據庫之間存在不匹配。

另外GetOrdinal比硬編碼序號本身作爲幻數少得多。

相關問題