我为我通常在项目的 DAL 中使用的一堆方法构建了一个围绕 NpgSQL 的包装器。其中两个,我通常用来直接从 DataReader 填充 DTO。通常在填充辅助方法中,我将实例化 DTO 并遍历将 Datareader 的数据映射到相应属性的属性。填充方法大部分时间都会生成。
由于我允许许多属性为空或使用 DTO 的默认值,因此我使用了一种方法来检查 dataReader 的数据是否对属性有效,然后再填写属性。所以我将有一个 IsValidString("fieldname") 和一个 DRGetString("fieldname") 方法,如下所示:
public bool IsValidString(string fieldName)
{
if (data.GetOrdinal(fieldName) != -1
&& !data.IsDBNull(data.GetOrdinal(fieldName)))
return true;
else
return false;
}
public string DRGetString(string fieldName)
{
return data.GetString(data.GetOrdinal(fieldName));
}
我的填充方法被委托给执行查询的任何方法,如下所示:
public static object FillObject(DataParse<PostgreSQLDBDataParse> dataParser)
{
TipoFase obj = new TipoFase();
if (dataParser.IsValidInt32("T_TipoFase"))
obj.T_TipoFase = dataParser.DRGetInt32("T_TipoFase");
if (dataParser.IsValidString("NM_TipoFase"))
obj.NM_TipoFase = dataParser.DRGetString("NM_TipoFase");
//...rest of the properties .. this is usually autogenerated by a T4 template
return obj;
}
这在 NpgSQL pre 2.02 中工作得很好。. 当调用 GetOrdinal 方法时,如果 dataReader 中不存在该字段,我会简单地返回 -1。在 IsValidString() 中很容易返回 false 并直接跳到下一个属性。检查不存在的字段对性能的影响几乎可以忽略不计。
不幸的是,当字段不存在时,对 NpgSQL 的更改会使 GetOrdinal 抛出异常。我有一个简单的解决方法,我将代码包装在 try /catch 中并在 catch 中抛出 false。但是我能感觉到性能受到了打击,尤其是当我进入调试模式时。填写一长串需要几分钟。
据推测,NpgSQL 有一个可以添加到连接字符串(兼容性)的参数以支持此方法的向后兼容性,但我从来没有让它正常工作(由于连接字符串格式错误,我总是遇到异常)。无论如何,我正在寻找更好的解决方法的建议。有什么更好的方法可以从数据读取器中填充对象,甚至可以以某种方式解决异常问题?