与this question相似,但答案从未真正解决过我想知道的问题。从DataReader获取值是否有任何标准?就是这个
dataReader.GetString(dataReader.GetOrdinal("ColumnName"));
认为更好/更差/与此相同?
(string) dataReader["ColumnName"];
答案 0 :(得分:11)
这是我的方式:
Int32 ordinal = dataReader.GetOrdinal("ColumnName");
if (!dataReader.IsDBNull(ordinal))
yourString = dataReader.GetString(ordinal);
检查上面显示的DBNull
非常重要,因为如果DataReader
中的字段为空,则在您尝试检索时会抛出异常。
答案 1 :(得分:9)
我制作了一些扩展方法,让我将IDataReader
视为可枚举,并通过返回可为空的整数来处理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
方法。