9

类似于这个问题,但答案从来没有真正解决我想知道的问题。从 DataReader 获取值是否有任何标准?即,这是

dataReader.GetString(dataReader.GetOrdinal("ColumnName"));

认为更好/更差/与此相同?

(string) dataReader["ColumnName"];
4

2 回答 2

11

这是我的做法:

Int32 ordinal = dataReader.GetOrdinal("ColumnName");

if (!dataReader.IsDBNull(ordinal))
    yourString = dataReader.GetString(ordinal);

DBNull像我上面显示的那样进行检查很重要,因为如果该字段为空,DataReader当您尝试检索它时它将引发异常。

于 2009-12-06T14:41:54.920 回答
9

我做了一些扩展方法,让我将 anIDataReader视为可枚举,并通过返回可为空的整数等来处理DbNull。这让我可以检查 null 并使用 C#??运算符应用默认值。

/// <summary>
/// Returns an IEnumerable view of the data reader.
/// WARNING: Does not support readers with multiple result sets.
/// The reader will be closed after the first result set is read.
/// </summary>
public static IEnumerable<IDataRecord> AsEnumerable(this IDataReader reader)
{
    if (reader == null)
        throw new ArgumentNullException("reader");

    using (reader)
    {
        while (reader.Read())
        {
            yield return reader;
        }
    }
}

public static int? GetNullableInt32(this IDataRecord dr, string fieldName)
{
    return GetNullableInt32(dr, dr.GetOrdinal(fieldName));
}

public static int? GetNullableInt32(this IDataRecord dr, int ordinal)
{
    return dr.IsDBNull(ordinal) ? null : (int?)dr.GetInt32(ordinal);
}

...等等其他GetDataType()方法IDataReader

于 2009-12-06T17:34:49.603 回答