与this question类似,但答案从未真正解决我想知道的问题。有没有关于从DataReader获取值的标准?也就是说,这是DataReader最佳实践
dataReader.GetString(dataReader.GetOrdinal("ColumnName"));
认为好/更糟糕/这一样吗?
(string) dataReader["ColumnName"];
与this question类似,但答案从未真正解决我想知道的问题。有没有关于从DataReader获取值的标准?也就是说,这是DataReader最佳实践
dataReader.GetString(dataReader.GetOrdinal("ColumnName"));
认为好/更糟糕/这一样吗?
(string) dataReader["ColumnName"];
这里是这样的,我做到这一点:
Int32 ordinal = dataReader.GetOrdinal("ColumnName");
if (!dataReader.IsDBNull(ordinal))
yourString = dataReader.GetString(ordinal);
检查DBNull
这是很重要的就像我上面显示,因为如果该字段是DataReader
空它会抛出一个异常时,您尝试检索它。
我做了一些推广方法,让我把一个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()
方法。
你可以直接调用'reader.Cast
好吧,如果'IDataReader'完全可以处理'IEnumerable'的话。然而,这种情况并非如此。签名是:'public interface IDataReader:IDisposable,IDataRecord' – 2009-12-07 17:33:26
不错,但是您可能想在以下语句后关闭阅读器:while(reader.Read())''循环 – 2010-07-01 12:07:06
绝对同意。我更多地了解获取实际值的语法差异,使用DataReader Item []功能与使用提供的DataReader.Get方法进行比较。 –
2009-12-06 14:54:23
我总是使用datareader [“column1”],阅读起来更好。 – 2009-12-06 15:00:31
由于'datareader [“列”]'格式返回一个对象,并且不是强类型的,所以如果数据是'DbNull',我认为你不会得到异常。你只需将'DbNull.Value'转换为'object'。当然,如果您不先执行'Convert.IsDbNull'检查,则可能会在稍后尝试使用该值时收到异常。 – 2009-12-06 17:26:26