【发布时间】:2014-03-21 21:49:22
【问题描述】:
所以,我一直在阅读一些代码,看到了一个有趣的模式,用于解析来自数据阅读器的数据。它看起来像:
public static long ParseLong(IDataReader reader, string field, long default)
{
long result;
var value = GetValue(reader, field);
if (value == DBNull.Value) return default;
// is this next line bad?
if (Int64.TryParse(value.ToString(), out result)) return result;
return default;
}
这种模式不适合我,因为它隐藏了类型转换异常,并且似乎转换为字符串然后再次转换比仅调用“Convert.ToInt64(value)”要慢。
我在这方面是不是有点离谱?是否有更好的模式来解析来自数据读取器的数据?
注意 - 在我的例子中,列的类型是“NUMBER(20)”。即使不是这种情况,最好还是抛出异常,以便开发人员在投入生产之前解决问题,对吧?
【问题讨论】:
-
你对解析有什么要求?跳过格式错误的数据是否有效?
-
这些行似乎更像是对设计不良的数据表的修复,其中长值存储在字符串字段中,然后需要准确解析以避免错误。如果字段被正确定义为 Long 则无需 TryParse 它们,只需转换即可(当然 null 检查仍然有效)
-
您是否将数字数据存储在字符字段中?如果不是,那么
value如果不为 null,则应该已经是 long。 -
实际上这个特定的代码库使用内联sql(参数化)。因此,代码中断的唯一原因是列的类型发生了变化或内联 sql 发生了变化。
-
IDataReader有一种方法可以将值读取为 long IDataRecord.GetInt64 为什么不直接使用它?您的方法导致将 long 装箱到对象,然后将其拆箱以再次创建 long 。可以使用IDataRecord.IsDBNull方法来检查值是否为null。
标签: c# casting datareader