2009-12-06 51 views
9

this question类似,但答案从未真正解决我想知道的问题。有没有关于从DataReader获取值的标准?也就是说,这是DataReader最佳实践

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

认为好/更糟糕/这一样吗?

(string) dataReader["ColumnName"]; 

回答

11

这里是这样的,我做到这一点:

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

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

检查DBNull这是很重要的就像我上面显示,因为如果该字段是DataReader空它会抛出一个异常时,您尝试检索它。

+0

绝对同意。我更多地了解获取实际值的语法差异,使用DataReader Item []功能与使用提供的DataReader.Get 方法进行比较。 – 2009-12-06 14:54:23

+0

我总是使用datareader [“column1”],阅读起来更好。 – 2009-12-06 15:00:31

+3

由于'datareader [“列”]'格式返回一个对象,并且不是强类型的,所以如果数据是'DbNull',我认为你不会得到异常。你只需将'DbNull.Value'转换为'object'。当然,如果您不先执行'Convert.IsDbNull'检查,则可能会在稍后尝试使用该值时收到异常。 – 2009-12-06 17:26:26

9

我做了一些推广方法,让我把一个IDataReader作为枚举,并通过返回null的整数,等等。这让我检查null并应用与C#??操作的缺省值处理DbNull

/// <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); 
} 

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

+0

你可以直接调用'reader.Cast ()'。 – SLaks 2009-12-06 22:04:57

+1

好吧,如果'IDataReader'完全可以处理'IEnumerable'的话。然而,这种情况并非如此。签名是:'public interface IDataReader:IDisposable,IDataRecord' – 2009-12-07 17:33:26

+0

不错,但是您可能想在以下语句后关闭阅读器:while(reader.Read())''循环 – 2010-07-01 12:07:06