ORMモドキ作成 (3)

OracleHelperについてもう少し(・∀・)

OracleHelperに渡すOracleParameterをDTOのインスタンスから作成する処理も用意しています。
リフレクションでPropertyInfo
を取得して、OracleParameterの作成&値の設定を行うメソッドです。
各プロパティの型からOracleDbTypeを決めてOracleParameterを作成し、そのValueにPropertyInfo.GetValue()した値を設定する処理です。


OracleParameterを作成する際にはOracleDbTypeを指定しますが、OracleDbTypeと.NETでの型マッピングについてはマッピング用のHashtableを用意してそれを利用しています。
今回はOracleDbType.Int32、OracleDbType.Int64、OracleDbType.Double、OracleDbType.Date、OracleDbType.NVarchar2だけで事足りていますけどね(´ω`)
外字を使う都合で今回はN*だけ使っていますが、CHAR/VARCHARとNCHAR/NVARCHARを使い分けたいときはちょっと考えないといけないですね。


後、OracleParameterを作る処理については、PKのみを作成するか(SELECT1件とDELETE用)、全フィールドを作成(INSERTとUPDATE用)するかがオプションになっています。
PKのみのOracleParameter
を作成する場合には、PropertyInfoからAttribute.GetCustomAttribute()して、PrimaryKeyAttributeが付加されているプロパティのみを対象にします。
また、同様にIgnoreFieldAttributeが付加されているプロパティについてはOracleParameter作成の対象外にしています。


Attributeを使用することにより、情報用の設定ファイルを不要にしているわけですね。
JavaでもEJB 3とかアノテーションでやっているような事です。


で、上記処理はDTO(.NET)→OracleParameter(データベース)用のデータバインドになるわけですが、その逆方向としてOracleDataReader(データベース)→DTO(.NET)のデータバインドもあります(`・ω・´)
これもIDataReader.GetName()で取得したフィールド名とDTOのプロパティ名をマッチングして、リフレクションで値を設定していくという処理をBindUtilみたいなクラスに用意しています。


Javaで言えばCommons BeanUtilsの親戚みたいな処理ですね(´ω`)