MySQL Connection/NET を使えば簡単に C# から MySQL を使えるけど、コネクションを開いて、コマンド生成して、パラメータ追加して・・・って面倒ですね。
そこで Enterprise Library (以下 EntLib) の力を借りてみました。EntLib のダウンロード先はこちら。
まず、プロジェクトの参照に
- Microsoft.Practices.EnterpriseLibrary.Common
- Microsoft.Practices.EnterpriseLibrary.Data
を追加。
そして、Mycrosoft.Practicec.EnterpriseLibrary.Data 名前空間内にある Database クラスを継承した MySqlDatabase クラスを作成。
public class MySqlDatabase : Database { public MySqlDatabase(string connectionString) : base(connectionString, MySqlClientFactory.Instance) { } protected char ParameterToken { get { return '?'; } } protected override void DeriveParameters(DbCommand discoveryCommand) { MySqlCommandBuilder.DeriveParameters((MySqlCommand)discoveryCommand); } public override string BuildParameterName(string name) { if (name[0] != this.ParameterToken) { return name.Insert(0, new string(this.ParameterToken, 1)); } return name; } }
これを使って、先日のコードを書き変えます。
public static Item Find(int id) { MySqlDatabase database = new MySqlDatabase(CONNECTION_STRING); string query="SELECT * FROM items WHERE id = ?id;"; using (DbCommand command = database.GetSqlStringCommand(query)) { database.AddInParameter(command, "id", DbType.UInt32, id); DataSet data = database.ExecuteDataSet(command); if (data.Tables[0].Rows.Count == 0) { return null; } else { return new Item() { Id = (uint)data.Tables[0].Rows[0]["id"], Title = (string)data.Tables[0].Rows[0]["title"], Description = (string)data.Tables[0].Rows[0]["description"] }; } } }
今回は EntLib なんか使わなくても、拡張メソッドで済みそうな内容でしたね。まあ、参考までに。