DbCommandにパラメーターをセットする手続きを分離する
ここまでを使って製品コードをリファクタリングしてみると、cmd.Parameters
をセットしているところもDbCommandHelper
に持っていきたくなります。
[TestCase] //製品コード: AddStringParameter()メソッドを実装 public void AddStringParameterTest() { using (DbCommandHelper helper = new DbCommandHelper()) using (DbCommand cmd = helper.CreateCommand(cmdText)) { helper.AddStringParameter(cmd, "@p1", "param1"); Assert.AreEqual("@p1", cmd.Parameters[0].ParameterName); Assert.AreEqual("param1", cmd.Parameters[0].Value); } }
これでDbCommandHelper
の完成です。
public class DbCommandHelper : IDisposable { private SqlCeConnection _connection; public SqlCeConnection Connection { get { if (_connection == null && disposed == false) { _connection = DbConnectionProvider.Connection; _connection.Open(); } return _connection; } } public DbCommand CreateCommand(string commandText) { var cmd = new SqlCeCommand(commandText); cmd.Connection = Connection; return cmd; } public void AddStringParameter(DbCommand cmd, string paramName, string parameter) { var p1 = cmd.CreateParameter(); p1.ParameterName = paramName; p1.DbType = System.Data.DbType.String; p1.Value = parameter; cmd.Parameters.Add(p1); } // Dispose パターンの実装のスケルトンはMSDNのサンプルからコピペする public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private bool disposed = false; protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { //↓ここだけはテストファーストで書く if (_connection != null) { _connection.Dispose(); _connection = null; } } disposed = true; } } }
検索するメソッドは、リファクタリングして次のようになりました。以前の「とりあえず実装してみた」製品コードと比べてみてください。
public static IList<Customer> 前方一致で姓名を検索する(string head) { var list = new List<Customer>(); if (string.IsNullOrWhiteSpace(head)) return list; using(DbCommandHelper helper = new DbCommandHelper()){ var cmdText = @"SELECT Country, [Company Name], [Customer ID], [Contact Name] FROM Customers WHERE ([Contact Name] LIKE @p1) OR ([Contact Name] LIKE @p2)"; using (DbCommand cmd = helper.CreateCommand(cmdText)) { helper.AddStringParameter(cmd, "@p1", head + "%"); helper.AddStringParameter(cmd, "@p2", "% " + head + "%"); using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { var customer = new Customer() { Country = reader.GetString(0), CompanyName = reader.GetString(1), CustomerID = reader.GetString(2), ContactName = reader.GetString(3), }; list.Add(customer); } } } } return list; }