DataReader最佳实践

AJ.*_*AJ. 9 datareader

这个问题类似,但答案从未真正解决过我想知道的问题.从DataReader获取值是否有任何标准?就是这个

dataReader.GetString(dataReader.GetOrdinal("ColumnName"));
Run Code Online (Sandbox Code Playgroud)

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

(string) dataReader["ColumnName"];
Run Code Online (Sandbox Code Playgroud)

And*_*are 11

这是我这样做的方式:

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

if (!dataReader.IsDBNull(ordinal))
    yourString = dataReader.GetString(ordinal);
Run Code Online (Sandbox Code Playgroud)

重要的是检查DBNull我上面显示的内容,因为如果该字段为空,则DataReader在您尝试检索它时会抛出异常.

  • 由于`datareader ["column"]`格式返回一个对象并且不是强类型的,所以如果数据是'DbNull`,我认为你不会得到异常.你只需将'DbNull.Value`强制转换为`object`.当然,如果您不首先执行`Convert.IsDbNull`检查,则在尝试使用该值时可能会出现异常. (3认同)

Joe*_*ler 9

我做了一些扩展方法让我把一个处理IDataReader为一个枚举,并DbNull通过返回可空的int等来处理.这让我检查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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • @SwissCoder - `using`语句只要求你传入`IDisposable`实例.它不需要您在parens中创建实例. (4认同)
  • @Ulf - 这就是`using(reader)`语句的用途. (3认同)