CodeZine(コードジン)

特集ページ一覧

Monoで他のDBも使ってみたよ!(PostgreSQL、MySQL編)

MonoでPostgreSQL、MySQLを使う

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/12/23 14:00
目次

5.MySQL編

 MySQL用データプロバイダ「MySql.Data(Connector/NET 5.2.3)」を使用したDBアクセスについて解説を行います。MySQLについてはWikipediaなどを参照してください。

 「MySql.Data」はC#コードだけで実装されたMySQL用データプロバイダで、他のネイティブライブラリを必要としません。MySQL 4.0以上に対応しています。

セットアップ

 ホストOS側で動作確認用MySQL DBを作成し、ゲストOS側でMySQL用データプロバイダ「MySql.Data」の準備を行います。

 「MySQL 5.0 Community Server」はMySQLのWebサイトから「Windows Essentials (x86)」版をダウンロードし、インストールします。本稿ではインストール自体の解説は割愛します。

 「MySql.Data」もMySQLのWebサイトから「Sources (ZIP)」版をダウンロードし、「MySql.Data」のビルドを行います。詳細については データプロバイダで解説します。

MySQL DB

 動作確認用DB(TestData)を作成します。mysqlコマンド(MySQL Command Line Client)を使用したDB操作を行います。

 なお、文字コードの設定は以下になります。

> mysql -u root -p
mysql > show variables like 'character_set%';
+--------------------------+-----------------------------------------------------+
| Variable_name            | Value                                               |
+--------------------------+-----------------------------------------------------+
| character_set_client     | sjis                                                |
| character_set_connection | sjis                                                |
| character_set_database   | sjis                                                |
| character_set_filesystem | binary                                              |
| character_set_results    | sjis                                                |
| character_set_server     | sjis                                                |
| character_set_system     | utf8                                                |
| character_sets_dir       | D:\Dev\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-----------------------------------------------------+

 また、デフォルトストレージエンジンとして「INNODB」を設定しています。

my.ini から抜粋
# The default storage engine that will be used when create new tables when
default-storage-engine=INNODB

 MySQLの起動は、インストール時にサービスとして登録されるので、自動で起動します。

テーブル作成用SQLファイルの準備

 「D:\Dev\MySQL\sql」(任意)に以下のテーブル作成用SQLファイルを用意します。

Products.sql
-- mysql -u root -p TestData -t < sql\Products.sql
--
-- Products テーブル削除
drop table if exists Products;

-- Products テーブル作成
create table Products(
    ProductID int not null primary key,
    ProductName text not null,
    Price numeric(7,2) null,
    ProductDescription text null);

-- INSERT 実行
insert into Products (ProductID, ProductName, Price, ProductDescription)
    values (0, 'MySQL', null, 'MySQL 5.0 Community Server');

-- INSERT 実行
insert into Products (ProductID, ProductName, Price, ProductDescription)
    values (1, 'Clamp', 12.48, 'Workbench clamp');

-- INSERT 実行 カラムの順番を変えたパターン
insert into Products (ProductName, ProductID, Price, ProductDescription)
    values ('Screwdriver', 50, 3.17, 'Flat head');

-- INSERT 実行 カラムリスト指定なし、入力値リストはカラム順パターン
insert into Products
    values (75, 'Tire Bar', null, 'Tool for changing tires.');

-- INSERT 実行 ProductDescription カラムの指定なしパターン
insert into Products (ProductID, ProductName, Price)
    values (3000, '3mm Bracket', .52);

-- UPDATE 実行
update Products
    set ProductName = 'Flat Head Screwdriver'
    where ProductID = 50;

-- SELECT 実行 確認用
select * from Products;
データベース作成
> mysql -u root -p
mysql > create database TestData;
ユーザー作成
> mysql -u root -p
mysql > grant all on TestData.* to 'sta'@'192.168.1.3' identified by 'password';
テーブル作成
> D:
> cd Dev\MySQL
> mysql -u root -p TestData -t < sql\Products.sql
or
> mysql -u root -p TestData
mysql > \. sql\Products.sql

データプロバイダ

 当初、「Connector/Net 5.2.3」の「Windows Binaries, no installer (ZIP)」版を使用し、接続確認を行ったところ

Unhandled Exception: System.ArgumentException: Encoding name 'sjis' not supported
Parameter name: name

という例外が発生しました。そこで「Sources (ZIP)」版を確認してみると、ソース資源内の「CharSetMap.cs」に以下の修正を行う必要があることが分かり、

104行目
  mapping.Add("sjis", new CharacterSet("sjis", 2));
変更
  mapping.Add("sjis", new CharacterSet("shift_jis", 2));

 次の手順で対応を行いました。

1. プロジェクトを開く

 「Sources (ZIP)」版資源(mysql-connector-net-5.2.3-src.zip)を任意の場所(~/tmp/mysql-connector-net-5.2.3-src)に展開し、MonoDevelopからプロジェクトファイル「~/tmp/mysql-connector-net-5.2.3-src/MySql.Data/Provider/MySql.Data.csproj」を開く。

2. CharSetMap.csを修正

 上記内容で「CharSetMap.cs」の修正後、保存を行う。

3. シンボルの定義を修正
  • [ソリューションビュー]内 で[「MySql.Data」プロジェクトアイコン]を右クリックし、[オプション]を選択
  • [プロジェクトオプション]画面の[カテゴリ]欄内で、[コンフィグレーション]配下のアクティブなコンフィグレーション(標準では[Debug|Any CPU])を選択
  • [コンパイラオプション]を選択
  • [シンボルを定義]入力欄で以下の変更を行う
TRACE;DEBUG;WINDOWS NET20 → TRACE;DEBUG;NET20
4. ビルド実行

 「MySql.Data」プロジェクトのビルドを行う。ビルド時に警告が8件ほど表示されますが、特に問題はないようです。

5. GACへ登録

 ビルド後、「MySql.Data」をGACへ登録(もしくはMONO_PATHによる配置)を行う。

GACへ登録
> cd ~/tmp/mysql-connector-net-5.2.3-src/MySql.Data/Provider/bin/net-2.0/Debug
> su
# gacutil -i MySql.Data.dll -package 2.0
Package exported to: /usr/lib/mono/2.0/MySql.Data.dll -> ../gac/MySql.Data/5.2.3.0__793f2ad4907c83be/MySql.Data.dll
Installed MySql.Data.dll into the gac (/usr/lib/mono/gac)
補足説明

 上記例外は、GetEncoding(System.Text.Encoding.GetEncoding)メソッド使用時に発生しています。MSDNのEncodingクラスの解説では、サポートされているエンコーディングと、それに対応するコードページの一覧表が掲載されています。

 シフトJISは、

コードページ:932
名前:shift_jis
表示名:日本語 (シフト JIS) 

とありますので、Encodingオブジェクトの取得は

Encoding.GetEncoding(932) or Encoding.GetEncoding("shift_jis")

で可能です。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:MonoでDBMS用データプロバイダを使う

著者プロフィール

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5