連載
» 2013年07月23日 12時31分 UPDATE

連載:MonoでOSSなASP.NET MVCアプリ:第2回 MySQL ConnectorでDBに接続 (1/3)

Mono×Linux環境でMySQL Connector/NETやメンバーシップAPIを使う方法、さらにJenkinsで継続的インテグレーションを実施する方法を解説する。

[井口圭一,HEROZ株式会社]
連載:MonoでOSSなASP.NET MVCアプリ
業務アプリInsider/Insider.NET

powered by Insider.NET

「連載:MonoでOSSなASP.NET MVCアプリ」のインデックス

連載目次

 今回は、前回の「Mono×LinuxでASP.NET MVCを動かすまで」の続編として、「MySQL Connector/NET」(=.NETからMySQLデータベースにアクセスできるADO.NETドライバ)を使って、データベースに接続する方法を紹介する。コードはC#で記述する。

 MySQLは言わずもがな、オープンソースの世界では1、2のシェアを持つDBMSだ。今年になってリリースされた最新のMySQL 5.6ではパフォーマンスが改善されたり、インデックスがオンラインで追加できるようになったりと、まだまだ進化を続けている。

 MySQLでは、ADO.NET経由で接続するためのコネクタとして「Connector/NET」が提供されている。このコネクタが当然(?)、.NETと互換性のあるMonoからも使用できる。

MySQL Serverをインストール

 まずは、MySQL Serverを(前回構築した)Linuxサーバにインストールし、起動しておこう。

# yum install mysql-server
# /etc/init.d/mysqld start


MySQL Serverをインストール&起動するためのコマンド
上記のコマンドでインストールできないパッケージがあった場合や、このほかにインストールが必要なパッケージがあった場合は、「yum list | grep <パッケージ名の一部(mysql-serverなど)>」というコマンドで、パッケージを探してから、「yum install <適切なパッケージ名(mysql-server.x86_64など)>」というコマンドでパッケージをインストールし直せばよい。

 MySQL Serverのデフォルトの設定では、かなり小規模なサービス用になっているので、本格的にサービスを行うにはいくつか設定変更が必要だが、そのまま起動してもテスト用には使える(ただし、rootのパスワードが設定されていなかったり、グローバルIPでListenしていたりするので、インターネット環境では十分注意が必要だ)。

 なお、実際に開発する場合には、Visual Studioを実行しているローカルのWindowsにもMySQL Serverをインストールしたほうが開発しやすい場合もあるだろう。Windows版のMySQL ServerもMicrosoft Windowsインストーラ(.msiファイル)で簡単にインストールできるので、必要に応じて入れてみてほしい(MySQLダウンロード・サイト)。サーバと同じテーブル構造さえ作っておけば、ローカルでデバッグできるのでお手軽だ。

MySQL Connector/NETを設定

 次にADO.NETからMySQL Serverに接続するためのMySQL Connector/NETをプロジェクトに追加しよう(今回の内容を試すために、独自にASP.NET MVCアプリを作成する場合は、こちらからダウンロードしたWebアプリのソース・ファイル群を、「.NET Framework 4」の「ASP.NET 空の Web アプリケーション」テンプレートで作成したプロジェクト内に追加すればよい)。

 MySQL Connector/NETはNuGetで取得できるので、追加はとても簡単だ(もちろんMySQLのサイトから直接ダウンロードすることも可能だ)。NuGetで「MySQL」と検索すると、下記のようなパッケージが見つかる。

[NuGet パッケージの管理]ダイアログで「MySql.Data」という名前のパッケージをインストール [NuGet パッケージの管理]ダイアログで「MySql.Data」という名前のパッケージをインストール
このダイアログは、[ソリューション エクスプローラー]のプロジェクト項目の右クリック・メニューから[NuGet パッケージの管理]を選択すれば起動できる。

 この中の「MySql.Data」をインストールしよう。インストールが完了すると、参照設定に「MySql.Data」アセンブリが追加されるので、ビルド時に結果に含まれるように[プロパティ]ウィンドウ内の[ローカル コピー]が「True」になっていることを確認しておこう(次の画面を参照)。

[参照設定]に追加された「MySql.Data」アセンブリと、[ローカル コピー]プロパティに「True」の設定 [参照設定]に追加された「MySql.Data」アセンブリと、[ローカル コピー]プロパティに「True」の設定

 最後にWeb.configファイルに(下記のような)接続文字列を設定すれば準備完了だ。

<connectionStrings>
  <add name="sample" providerName="MySql.Data.MySqlClient"
    connectionString="Server=localhost;Database=test;Uid=root;Pwd=somepass" />
</connectionStrings>

接続文字列の設定(Web.config)

 ここでは接続に必要な最小限の内容のみ設定したが、<connectionString>要素に設定できる項目は多岐にわたるので、リファレンス・マニュアルを参考にしていただきたい。

MySQLに接続!

 それでは、実際にMySQLサーバに接続してみよう。

 接続方法はSQL Serverの場合とほとんど同じだ。DbConnectionクラスのオブジェクトとして、(そのクラスを継承している)MySqlConnectionクラス(MySql.Data.MySqlClient名前空間)のインスタンスを作ってやれば、あとはADO.NETの通常の処理と何ら変わらない。

 ここでは、ASP.NET MVCのお作法にのっとって、Models内に(モデルとして)SampleModels.csファイルを作ってみよう。コードは以下のとおり。

using System;
using System.Configuration;

namespace sampleapp2.Models
{
  public class SampleModels
  {
    private static readonly string connStr
      = ConfigurationManager.ConnectionStrings["sample"].ConnectionString;

    /// <summary>
    /// データベースから現在の時刻を取得
    /// </summary>
    /// <returns>データベースの現在時刻</returns>
    public static DateTime GetDateTime()
    {
      using (var conn = new MySql.Data.MySqlClient.MySqlConnection(connStr))
      {
        conn.Open();
        var cmd = conn.CreateCommand();
        cmd.CommandText = "select now()";
        cmd.Connection = conn;
        using (var reader = cmd.ExecuteReader())
        {
          reader.Read();
          return reader.GetDateTime(0);
        }
      }
    }
  }
}

MySQLサーバに接続してデータベースの現在時刻を取得するモデルのコード例(SampleModels.cs)

 続いてコントローラからモデルを呼び出して、結果を表示してみよう。

using sampleapp2.Models;
using System.Web.Mvc;

namespace sampleapp2.Controllers
{
  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      ViewBag.Message = string.Format("現在の時刻は {0} です。", SampleModels.GetDateTime());

      return View();
    }
  }
}

先ほどのモデルのコードを呼び出すコントローラのコード例(HomeController.cs)

 わざわざデータベースにつないで現在時刻を取ってきても意味がないが、接続テストだと思って見逃してほしい。うまく接続できれば、次の画面のように時刻が表示されるはずだ(デプロイ直後は、Monoのエラーが表示されることがあるが、再読み込みを行えば、2回目以降は表示されるはずだ)。

MySQLサーバに接続するサンプル・アプリの実行例 MySQLサーバに接続するサンプル・アプリの実行例

       1|2|3 次のページへ

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。