我在我的項目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中的對象,或者甚至以某種方式解決異常問題?