ORMモドキ作成 (2)

で、昨日からの続きです(・∀・)
ORMモドキの中身について、ちょっと触れてみたいと思います。


GenericDaoの内部処理としては、DTOの型情報からSQL文を取得、DTOインスタンスからOracleParameter[]を作成、SQLとOracleParameterから処理を実行みたいなことをしています。


このうち、SQL文の実行についてはOracleHelperクラスを利用しています。
OracleHelperクラスというのは、PetShopや(旧)DAABのソースを見たことがある方ならご存じだと思いますが、あのSqlHelperクラスと同等のものをODP.NET用に作成したものです。


こんな感じのヤツですね(・∀・)

public abstract class OracleHelper
{
    private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, CommandType cmdType, string cmdText, OracleParameter[] parameters);
    public static int ExecuteNonQuery(OracleConnection conn, CommandType cmdType, string cmdText, params OracleParameter[] parameters);
    public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] parameters);
    public static object ExecuteScalar(OracleConnection conn, CommandType cmdType, string cmdText, params OracleParameter[] parameters);
    public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] parameters);
    public static OracleDataReader ExecuteReader(OracleConnection conn, CommandType cmdType, string cmdText, params OracleParameter[] parameters);
    public static OracleDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] parameters);
}

で、ODP.NETではOracleParameterがIDisposableだったり、トランザクション周りだとか、微妙に違う部分があるんですよね( ´・ω・`)
OracleParameterについてはちゃんとDispose()しておかないとトランザクションを連続したときにメモリ使用量が増えていっちゃいますし。
トランザクションについてもSQL ServerみたいにSqlTransactionをSqlCommand.Transactionに設定するのではなくて、こんな感じの処理を記述します。

using( OracleConnection conn = new OracleConnection( connectionString ) )
{
    conn.Open();

    using( OracleTransaction tx = conn.BeginTransaction( IsolationLevel.ReadCommitted ) )
    {
        try
        {
            int effect = OracleHelper.ExecuteNonQuery( conn, CommandType.Text, sql );
            tx.Commit();
        }
        catch(Exception)
        {
            tx.Rollback();
            throw;
        }
    }
}

こういった部分もちゃんと検証してOracleHelperクラスは作成しています(`・ω・´)


で、ふと思ったんですけど、どうせならNpgsql版のHelperも作っておけば良かったかな〜なんて。
[id:machi_pon:20060710:1152533976]でGoogle MapsPostGISで遊ぶのにはNpgsqlを使っていたんですが、どうせサービス層の処理の数も少ないと思ってDB周りをベタ書きしていたら、機能を追加しているうちに処理数も増えてきてしまって…(´ω`)