プロジェクトのDALで通常使用する一連のメソッド用にNpgSQLのラッパーを作成しました。それらのうちの2つは、通常、DataReaderから直接DTOを入力するために使用します。通常、フィルヘルパーメソッドでは、DTOをインスタンス化し、Datareaderのデータを対応するプロパティにマッピングするプロパティを反復処理します。ほとんどの場合、fillメソッドが生成されます。
プロパティの多くをnullにするか、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));
}
私のfillメソッドは、クエリを実行したメソッドに遅延し、次のようになります。
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;
}
これは、2.02より前のNpgSQLでは正常に機能していました。。GetOrdinalメソッドが呼び出されたときに、フィールドがdataReaderに存在しなかった場合は、単に-1が返されます。IsValidString()でfalseを返し、次のプロパティにスキップするのは簡単です。存在しないフィールドをチェックすることによるパフォーマンスのヒットは、事実上無視できました。
残念ながら、NpgSQLを変更すると、フィールドが存在しない場合にGetOrdinalが例外をスローします。コードをtry/catchでラップし、catch内でfalseをスローするという簡単な回避策があります。しかし、特にデバッグモードに入ると、パフォーマンスの低下を感じることができます。長いリストへの記入には数分かかります。
おそらく、NpgSQLには、このメソッドの後方互換性をサポートするために接続文字列(互換性)に追加できるパラメーターがありますが、それが正しく機能することはありません(接続文字列の形式が正しくないため、常に例外が発生します)。とにかく、私はより良い回避策のための提案を探しています。データリーダーからオブジェクトを入力する、または何らかの方法で例外の問題を回避するためのより良い方法はありますか?