第2回 MySQL ConnectorでDBに接続:連載:MonoでOSSなASP.NET MVCアプリ(1/3 ページ)
Mono×Linux環境でMySQL Connector/NETやメンバーシップAPIを使う方法、さらにJenkinsで継続的インテグレーションを実施する方法を解説する。
powered by Insider.NET
今回は、前回の「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
上記のコマンドでインストールできないパッケージがあった場合や、このほかにインストールが必要なパッケージがあった場合は、「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」をインストールしよう。インストールが完了すると、参照設定に「MySql.Data」アセンブリが追加されるので、ビルド時に結果に含まれるように[プロパティ]ウィンドウ内の[ローカル コピー]が「True」になっていることを確認しておこう(次の画面を参照)。
最後にWeb.configファイルに(下記のような)接続文字列を設定すれば準備完了だ。
<connectionStrings>
<add name="sample" providerName="MySql.Data.MySqlClient"
connectionString="Server=localhost;Database=test;Uid=root;Pwd=somepass" />
</connectionStrings>
ここでは接続に必要な最小限の内容のみ設定したが、<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);
}
}
}
}
}
続いてコントローラからモデルを呼び出して、結果を表示してみよう。
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();
}
}
}
わざわざデータベースにつないで現在時刻を取ってきても意味がないが、接続テストだと思って見逃してほしい。うまく接続できれば、次の画面のように時刻が表示されるはずだ(*デプロイ直後は、Monoのエラーが表示されることがあるが、再読み込みを行えば、2回目以降は表示されるはずだ)。
Copyright© Digital Advantage Corp. All Rights Reserved.