MySqlDatabase

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 なんか使わなくても、拡張メソッドで済みそうな内容でしたね。まあ、参考までに。