DBのユニットテスト② .NET

前回の続きです。
userInfoテーブルに対応するBeanとDaoを作ってみます。



User.cs

Beanを作ろうと思ったけど、
.NETはDataSetがあるんでいらないかも。
なので今回は作りません。



DbUtils.cs

DbProviderFactoryを使って、IDbConnection、IDataParameter、
IDbCommandを生成するユーティリティクラスです。


データベースプロバイダ名は、App.configから取ってきます。
今回はSQLServerなんで「System.Data.SqlClient」ですが、
「System.Data.OracleClient」にしたら、きっとOracleにも繋がるはず。たぶん。


ADO.NETでデータベースに依存しない実装はこんな感じなのかな。たぶん。


using System;
using System.Configuration;
using System.Data;
using System.Data.Common;

namespace NDbUnitSample
{
    public class DbUtils
    {
        private DbProviderFactory factory;
 
        public DbUtils()
        {
            string dbProviderName = ConfigurationManager.ConnectionStrings["DataBase"].ProviderName;
            this.factory = DbProviderFactories.GetFactory(dbProviderName);
        }

        public IDbConnection CreateConnection()
        {
            return this.factory.CreateConnection();
        }

        public IDataParameter CreateParameter(string name, object value)
        {
            IDataParameter param = this.factory.CreateParameter();
            param.ParameterName = name;
            param.Value = value;
            return param;
        }

        public IDbCommand CreateCommand(IDbConnection con, string sql, params IDataParameter[] sqlParams)
        {
            IDbCommand command = con.CreateCommand();
            command.CommandText = sql;
            foreach (IDataParameter param in sqlParams)
            {
                command.Parameters.Add(param);
            }
            return command;
        }

        public DataSet CreateDataSet(IDbCommand command, string tabaleName)
        {
            IDbDataAdapter da = this.factory.CreateDataAdapter();
            da.SelectCommand = command;
            DataSet ds = new DataSet();
            da.TableMappings.Add("Table", tabaleName);
            da.Fill(ds);
            return ds;
        }

    }
}

UserDao.cs

先程のDbUtilsを使って実装してみます。
Java版のDaoと同じような実装になったかな。



using System;
using System.Data;

namespace NDbUnitSample
{
    public class UserDao
    {
        private IDbConnection con;
        private DbUtils utils = new DbUtils();

        public UserDao(IDbConnection con) 
        {
            this.con = con;
	}

        public DataSet SelectAll() 
        {
            string sql = "SELECT * FROM userInfo ORDER BY id ASC";
            IDbCommand command = this.utils.CreateCommand(this.con, sql);
            return this.utils.CreateDataSet(command, "userInfo");
        }

        public DataSet Select(int id) 
        {
            string sql = "SELECT * FROM userInfo WHERE id = @id";
            IDataParameter pId = this.utils.CreateParameter("@id", id);
            IDbCommand command = this.utils.CreateCommand(this.con, sql, pId);
            return this.utils.CreateDataSet(command, "userInfo");
        }

        public void Insert(int id, string name) 
        {
            string sql = "INSERT INTO userInfo(id, name) VALUES(@id, @name)";
            IDataParameter pId = this.utils.CreateParameter("@id", id);
            IDataParameter pName = this.utils.CreateParameter("@name", name);
            IDbCommand command = this.utils.CreateCommand(this.con, sql, pId, pName);
            command.ExecuteNonQuery();
	}

	public void Update(int id, string name) 
        {
            string sql = "UPDATE userInfo SET name = @name WHERE id = @id";
            IDataParameter pId = this.utils.CreateParameter("@id", id);
            IDataParameter pName = this.utils.CreateParameter("@name", name);
            IDbCommand command = this.utils.CreateCommand(this.con, sql, pId, pName);
            command.ExecuteNonQuery();
	}

	public void Delete(int id) 
        {
            string sql = "DELETE FROM userInfo WHERE id = @id";
            IDataParameter pId = this.utils.CreateParameter("@id", id);
            IDbCommand command = this.utils.CreateCommand(this.con, sql, pId);
            command.ExecuteNonQuery();
	}

    }
}


うーん・・・とりあえず試行錯誤しながら実装してみたものの、
これってADO.NETの一般的な実装方法なんだろうか・・・ちょっとJavaっぽいかも。


ADO.NET Entity Framework」というのもありますね。


お久しぶりの.NETなんでイマイチわかりません・・・
.NETに詳しい方のコメントもらえると飛び跳ねて喜びます(ノ゚Д゚)八(゚Д゚ )ノ