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に詳しい方のコメントもらえると飛び跳ねて喜びます(ノ゚Д゚)八(゚Д゚ )ノ