2009-01-13 52 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比硬编码序号本身作为幻数少得多。

相关问题