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」を設定しています。
# The default storage engine that will be used when create new tables when default-storage-engine=INNODB
MySQLの起動は、インストール時にサービスとして登録されるので、自動で起動します。
テーブル作成用SQLファイルの準備
「D:\Dev\MySQL\sql」(任意)に以下のテーブル作成用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による配置)を行う。
> 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")
で可能です。
