DbCommandにパラメーターをセットする手続きを分離する
ここまでを使って製品コードをリファクタリングしてみると、cmd.ParametersをセットしているところもDbCommandHelperに持っていきたくなります。
DbCommandHelperにAddStringParameter()を実装するテスト
[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の完成です。
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;
}
}
}
検索するメソッドは、リファクタリングして次のようになりました。以前の「とりあえず実装してみた」製品コードと比べてみてください。
SqlServerCeに依存しなくなった前方一致で姓名を検索する()メソッド
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;
}
