空安全的方式从一个IDataReader的获取值
-
25-09-2019 - |
题
(所以LocalVariable)ABC.string(名称)=(IDataReader的)datareader.GetString(0);
此名称值是从数据库来.. 什么在这里发生的是,如果这名值为空,而读它抛出一个异常?
我手动,如果条件在这里做一些。我不想写一个手动状态,检查所有的变量..
我在做这样的事情现在..
string abc = (Idatareader)datareader.GetValue(0);
if(abc = null)
//assiging null
else
assiging abc value
是有什么样我们就可以编写扩展方法呢? 感谢
解决方案
下面是一对夫妇的扩展方法,这将很好地包裹起来你所有的顾虑周围从数据读取器检索强类型的值。如果该值的DBNull类型的默认将被退回。在string
的情况下,这是一个类,一个null
将被退回。如果该字段为int
,然后0
将返回。此外,如果你期待一个int?
,说从可为空的int字段,null
将返回。
有关Kumar的情况下的具体用法:
string abc = datareader.GetValueOrDefault<string>(0);
一般使用
var name = GetValueOrDefault<string>(reader, "Name");
或
var name = reader.GetValueOrDefault<string>("Name");
或
var name = reader.GetValueOrDefault<string>(0);
扩展
public static class NullSafeGetter
{
public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName)
{
int ordinal = row.GetOrdinal(fieldName);
return row.GetValueOrDefault<T>(ordinal);
}
public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal)
{
return (T)(row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal));
}
}
从 HTTP :// skysanders达网络/子文本/存档/ 2010/03/02 /仿制nullsafe-idatarecord场-getter.aspx
其他提示
类似于@天空桑德斯的答案,但与转换不太严格的:
public static T Get<T>(this IDataRecord row, string fieldName)
{
int ordinal = row.GetOrdinal(fieldName);
return row.Get<T>(ordinal);
}
public static T Get<T>(this IDataRecord row, int ordinal)
{
var value = row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal);
return (T)Convert.ChangeType(value, typeof(T));
}
我的解决方案为:
private static T GetValue<T>(object o) {
if (typeof(DBNull) != o.GetType()) {
return (T) o;
}
return default(T);
}
当,Status = GetValue<string>(currentDataRow["status"])
结合顶部的解决方案和建议,在这里是一个的 C#6箭头表达版本与GetValue<T>
和GetValueOrDefault<T>
带有可选默认值参数的支持。
public static class DataRecordExtensions {
/// <summary>
/// Generically extracts a field value by name from any IDataRecord as specified type. Will throw if DNE.
/// </summary>
public static T GetValue<T>(this IDataRecord row, string fieldName)
=> row.GetValue<T>(row.GetOrdinal(fieldName));
/// <summary>
/// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will throw if DNE.
/// </summary>
public static T GetValue<T>(this IDataRecord row, int ordinal)
=> (T)row.GetValue(ordinal);
/// <summary>
/// Generically extracts a field value by name from any IDataRecord as specified type. Will return default generic types value if DNE.
/// </summary>
public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName, T defaultValue = default(T))
=> row.GetValueOrDefault<T>(row.GetOrdinal(fieldName), defaultValue);
/// <summary>
/// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will return default generic types value if DNE.
/// </summary>
public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal, T defaultValue = default(T))
=> (T)(row.IsDBNull(ordinal) ? defaultValue : row.GetValue(ordinal));
}
我会使用这样的:
string abc = (IDataReader)datareader.GetValue(0) ?? "Default";
不隶属于 StackOverflow