我在我的项目DAL中通常使用的一堆方法构建了一个围绕NpgSQL的包装。其中两个,我通常用来从DataReader直接填充DTO。通常在填充帮助器方法中,我将实例化DTO并遍历将数据报告者的数据映射到相应属性的属性。大部分时间都会生成填充方法。NpgSQLdataReader GetOrdinal抛出异常..任何方式?
由于我允许许多属性为空或使用DTO的默认值,我已经使用了一种方法来检查dataReader的数据在填写属性之前是否对属性有效。所以我有一个IsValidString(“字段名”)和DRGetString(“字段名”)方法,像这样:
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));
}
我的填充方法delagated以任何方法执行查询,看起来像:
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预2.02工作正常和丹迪。 。当调用GetOrdinal方法时,如果该字段在dataReader中不存在,我只会返回-1。容易在IsValidString()中返回false,并简单地跳到下一个属性。检查不实际领域的表现实际上是可以忽略的。
不幸的是,当字段不存在时,对NpgSQL的更改会使GetOrdinal引发异常。我有一个简单的解决方法,在try/catch中包装代码并在catch中抛出false。但是我可以感受到性能方面的冲击,特别是当我进入调试模式时。填写一个长列表需要几分钟。
此外,NpgSQL有一个参数可以添加到连接字符串(Compatability)以支持这种方法的后向兼容性,但我从来没有得到这个工作正常(我总是得到一个异常,因为形成了一个错误连接字符串)。无论如何,我正在寻找更好的解决方法。有什么更好的方式来填写datareader中的对象,或者甚至以某种方式解决异常问题?