SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

MonoでFirebird、DB2を使う

  • X ポスト
  • このエントリーをはてなブックマークに追加

5.DB2編

 ODBC用データプロバイダ「System.Data.Odbc」を使用したDB2 DBへのアクセスについて解説を行います。ODBCDB2についてはWikipediaなどを参照してください。

 「System.Data.Odbc」はODBCドライバマネージャを必要とします。本稿では「unixODBC」を使用します。また、DB2用ODBCドライバが必要です。

セットアップ

 ゲストOS側で動作確認用DB2 DBを作成します。ホストOS側で使用するODBC用データプロバイダ「System.Data.Odbc」はアセンブリ「System.Data.dll」に含まれています。

 「DB2 Express-C」は、DB2 Express-Cのダウンロードページから「DB2 Express-C *.* for Linux」(「*.*」はVLで、現在は「9.7」)のリンクを選択し、「DB2 Express-C *.* for Linux 32-bit」(db2exc_***_LNX_x86.tar.gz)、「DB2 National Language Pack *.* for Linux 32-bit」(db2exc_nlpack_***_LNX_x86.tar.gz)をダウンロードして、インストールします。

 「DB2 Express-C 9.5.2」は、既にダウンロードが不可能で、現時点(2009.08.18)では「DB2 Express-C 9.7」がダウンロード可能となっています。「DB2 Express-C 9.7」を使用する場合は、下記の「補足2」を読んでください。

 MonoではDB2用データプロバイダ「IBM.Data.DB2」が提供されていますが、既にメンテナンス対象外であり、また実際使用してみると例外が発生し、うまくいきません。そこで本稿ではODBC用データプロバイダ「System.Data.Odbc」を使用してDB2 DBへアクセスを行います。

 「unixODBC」は、Ubuntuのパッケージ管理システムから導入可能です。

$ sudo apt-get install unixodbc

 DB2用ODBCドライバは、「IBM Data Server Client」に含まれているものを使用しました。本稿では、DB2 Version 9.5 fix packs & client downloads for 32 bit Linux operating systems on 32-bit Intel and AMD systems (x86)から、[V9.5 Fix Pack 3b for Linux (32 bit, Intel)]-[IBM Data Server Client](v9.5fp3b_linuxia32_client.tar.gz)および[DB2 National Language Package](v9.5fp3b_linuxia32_nlpack.tar.gz)をダウンロードしてインストールを行いました。

補足1

 「DB2 Express-C」のダウンロードの際、IBM IDの登録が必要になります。また、「DB2 National Language Pack *.* for Linux 32-bit」は各国語用言語パックですので、動作確認で必須というわけではありません。「IBM Data Server Client」においても、各国語用言語パックは必須ではありません。

補足2

 「DB2 9.7」がリリースされたのに伴い、「DB2 Express-C」のバージョンも9.7にアップされました!9.7を同様の環境にインストールし、動作確認を行いましたが、問題はありませんでした。また、後述する、リモート接続時の不具合対応は9.7では不要です。

DB2 DBの準備

 ゲストOS側で動作確認用DB(TestData)を作成します。「db2」コマンドを使用したDB操作を行います。

DB2 Express-Cのインストールについて

 DB2 Express-Cではいくつかのインストール方法が用意されています。IBM DB2 Database for Linux, UNIX, and Windows インフォメーション・センター内の「DB2 のインストール方式」を参考にして下さい。

 また、インストール前に以下の対応をすることをお勧めします。

/etc/pam.d/common-password の変更
...
# here are the per-package modules (the "Primary" block)
# password      [success=1 default=ignore]      pam_unix.so obscure sha512
password        [success=1 default=ignore]      pam_unix.so obscure sha256
...

 ホストOS側からリモート接続を試みた場合、

SQL30082N  セキュリティー処理は、理由 "15" ("PROCESSING FAILURE")
により失敗しました。  SQLSTATE=08001

というエラーが発生します。その原因はUbuntuのパスワード処理で使用しているハッシュ関数にあるようです。そこで、ゲストOS側の「/etc/pam.d/common-password」を編集し、ハッシュ関数をSHA512からSHA256かMD5に変更する必要があります。インストール後に対応した場合は、リモート接続で使用するユーザーのパスワードを再設定する必要があります(ここでいうパスワードとはゲストOSのユーザアカウントに設定されているパスワードのことです)。

 以下、主なDB操作をDB2インスタンス所有者(db2inst1)で行います。

SQLファイルの準備

 「/home/db2inst1/src/sql」に以下のDB、スキーマ、テーブル作成用および権限付与のためのSQLファイルを用意します。

TestData.sql
-- db2 -tvf ~/src/sql/TestData.sql
--
-- 区切り文字としてセミコロン「;」を使用しない場合:
--   db2 -vf ~/src/sql/TestData.sql
--
-- データベース削除
-- drop database TestData;

-- データベース作成
create database TestData on '/home/db2inst1/data/testdata'
    using codeset UTF-8 territory JP;

terminate;
schema4TestData.sql
-- db2 -tvf ~/src/sql/schema4TestData.sql
--
-- 区切り文字としてセミコロン「;」を使用しない場合:
--   db2 -vf ~/src/sql/schema4TestData.sql
--
connect to TestData;

-- EXAMPLE_SCM スキーマ削除
-- drop schema EXAMPLE_SCM restrict;

-- EXAMPLE_SCM スキーマ作成
create schema EXAMPLE_SCM;

terminate;
Products.sql
-- db2 -tvf ~/src/sql/Products.sql
--
-- 区切り文字としてセミコロン「;」を使用しない場合:
--   db2 -vf ~/src/sql/Products.sql
--
-- データベース接続
connect to TestData;
--
-- Products テーブル削除
-- drop table EXAMPLE_SCM.Products;

-- Products テーブル作成
create table EXAMPLE_SCM.Products(
    ProductID integer not null primary key,
    ProductName varchar(25) not null,
    Price decimal(7, 2),
    ProductDescription varchar(128));

-- INSERT 実行
insert into EXAMPLE_SCM.Products (ProductID, ProductName, Price, ProductDescription)
    values (0, 'DB2', null, 'DB2 Express-C 9.5.2');

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

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

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

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

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

-- SELECT 実行 確認用
select * from EXAMPLE_SCM.Products;

terminate;
grant4TestData.sql
-- db2 -tvf ~/src/sql/grant4TestData.sql
--
-- 区切り文字としてセミコロン「;」を使用しない場合:
--   db2 -vf ~/src/sql/grant4TestData.sql
--
connect to TestData;

-- 権限の付与
grant DBADM
    on DATABASE
    to USER sta;

terminate;

インスタンス起動

$ su - db2inst1
$ db2start

停止は

$ db2stop

データベース作成

$ mkdir -p ~/data/testdata
$ db2 -tvf ~/src/sql/TestData.sql

スキーマ作成

$ db2 -tvf ~/src/sql/schema4TestData.sql

テーブル作成

$ db2 -tvf ~/src/sql/Products.sql

権限の付与

 ユーザー(sta)に権限(例:DBADM)を付与します。

$ db2 -tvf ~/src/sql/grant4TestData.sql

次のページ
データプロバイダの準備

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
MonoでDBMS用データプロバイダを使う連載記事一覧

もっと読む

この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3975 2009/08/28 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング