TclODBC

 ODBC(Open DataBase Connectivity)は、マイクロソフト社が提唱している、 データベースにアクセスするプログラムをC言語で書く際の統一的なインターフェース (API)で、 マイクロソフトのAccess、オラクルのOracle、 サイベースのAdaptive Server Enterprise(旧SQL Server)など、 多くのRDBMS(リレーショナルデータベース管理システム)に採用されています。 TclODBCは、 ODBC経由でSQL文を発行してデータベースを操作するTclコマンドを、 Tcl処理系に追加する拡張ライブラリです。 これを使うと、Tcl/Tkのウィンドウ操作でODBCをサポートしているRDBMSに SQL文を実行させるなどの操作をさせることができ、 とても簡単にデータベースクライアントを作成することができます。

 TclODBCはフィンランドの Roy Nurmi さんが開発し、 Tcl 7.6の頃からフリーウェアとして公開されていたものですが、 2000年秋からSourceForge上で オープンソースプロジェクトとして開発されるようになりました。 現在のバージョンは2.3.1(UNIX向けは2.2)、 ODBC 2.0以降に対応し、Tcl7.6、8.0、8.1用のDLL が一体になった圧縮アーカイブ形式で配布されています。8.1用のDLLは スタブ機構に対応していて、8.2以降でも使用できます。

 下に私が実際に試してみた環境をまとめてみました。

RDBMSODBC DriverTcl/TkTclODBC
Oracle8i Personal Edition(8.1.6) Oracle ODBC Driver(付属)8.4a12.2
Sybase SQL Anywhere 5.0 Sybase SQL Anywhere 5.0(付属)8.4a12.2
Microsoft Access97 Microsoft Access Driver (*.mdb)8.3.02.2
Microsoft Access2002 Microsoft Access Driver (*.mdb)8.3.42.3.1


インストール

 Windows用のインストール手順です。 TclODBC のプロジェクトホームページから、 tclodbc.2.3.1.zipをダウンロードして、適当なディレクトリで展開します。 展開してできたディレクトリの「SETUP.TCL」 をエクスプローラでたたくなどして起動すると、 起動したTclのインストールディレクトリの中にTclODBCがインストールされます。 そのtclshやwishを起動して、 「package require tclodbc」と打ってみてください。 バージョン番号が表示されればOKです。


ODBCの設定を兼ねたウォームアッピング

 ぷぷっ。ウォームアッピングですって(うるさいよ)
TclODBCを使うには、データベースに合わせたODBCドライバをWindows にインストールし、また必要に応じてODBCデータソースの設定をする必要があります。 これはWin98/NTでは「コントロールパネル」→「(32bit)ODBCデータソース」を、 Win2000/XPでは「コントロールパネル」→「管理ツール」→「データソース(ODBC)」 を選び、ODBCデータソースアドミニストレータで行います。 ここでは、MS Access2002のMDBファイル、 C:\usr\dbms\access\shiten.mdb を「DSshiten」 という名前のユーザーデータソースとして定義したものとします。

 それでは、正しくデータソースが認識されるか確認してみます。 どうやって? ピシピシ!このページのタイトルを見てくれたぎゃー! ピシピシピシ!

よくって? (よかねーよ)

package require tclodbc

puts "Available ODBC data sources are:"
puts [database datasources]
puts "Available ODBC drivers are:"
puts [database drivers]

 TclODBCを使うには「package require tclodbc」とします。 で、「database datasources」コマンドで現在登録されているデータソースの一覧が、 「database drivers」コマンドで現在インストールされているODBCドライバの一覧が表示されます。 データソースの中に上で定義したDSshitenのレコードがあれば準備はOKです。


SQL文を発行してみんとす

package require tclodbc

database db DSshiten
#database db DSshiten user password
#database db \
#"DRIVER=Microsoft Access Driver (*.mdb);DBQ=C:\\usr\\dbms\\access\\shiten.mdb"

db set encoding cp932
db set autocommit off

if {[catch {
  set resultset [db "SELECT * FROM SHITEN WHERE SHITEN_NAME LIKE '%大阪%'"]
  puts $resultset
} e]} {
  puts [encoding convertfrom cp932 $e]
}

#{TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME
# PRECISION LENGTH SCALE RADIX NULLABLE REMARKS}
foreach e [db columns SHITEN] { puts $e }

db disconnect

 今度はデータベースに接続し、SQL文でデータを検索してみます。 Accessのようなユーザ認証のないデータベースに接続する場合、 最も簡単には 「database ハンドル名 データソース名」 でOKです。ハンドル名には一意の識別名を適当につけます。 ここではTclODBC付属のサンプルをまねてdbと名づけています。 dはデビッドのd、bはボブソンのbです。 (誰?)

 データベースに認証が必要な場合、データソース名の後ろに引数を2つ、 これすなわち接続ユーザ名とパスワードを付け加えます。

 一般ユーザーに広範に配布する場合などで、 いちいちユーザーデータソースを定義していない場合には、 2番目の「DRIVER=…;DBQ=…」DSN表記を使います。 例はAccessに接続する場合のDSN表記の例ですが、 別のRDBMSの場合にはDBQの代わりにDBFを使う等、書き方が異なる場合があります。 詳細はODBCドライバのヘルプで確認することをお勧めします。

 「ハンドル名 set encoding」コマンドは、発行するSQL文、 及びデータベースからの結果集合に非英語圏の文字が含まれる場合、 そのエンコーディング変換を自動的に行わせるオプションです。 「ハンドル名 set autocommit」はオートコミットを行うかどうかの設定 (デフォルトはon)です。offにすると、 「ハンドル名 commit」や「ハンドル名 rollback」 コマンドで明示的にコミットかロールバックを行うことになります。 (このサンプルではSELECT文しか発行してないので意味ありませんが)

 で、SQL文の発行は「ハンドル名 SQL文」とするだけです。 SELECT文の場合は結果集合がリストのリスト(列の値リストが行の数だけ) で返ってきます。DML文(UPDATE、INSERT、DELETE) の場合は、更新の影響を与えた行の数が整数で返ります。 エラーが発生した場合、日本語版のWindowsだと通常、 日本語のエラーメッセージがネイティブのcp932で表示されるので、 これをencoding convertfromコマンドで変換して表示しています。 が、一部?文字が表示されることがあるようです。

 データ操作が終わったら、最後に「ハンドル名 disconnect」 コマンドで接続を終了します。

 …で一通りシンプルなTclODBCの使い方のご紹介でしたが、 後便利かもしれないコマンドは「ハンドル名 columns 表名」 で、これはOracleのDESCRIBEのように表の列定義を細かく取得できるコマンドです。 戻り値はこれまたリストのリストで、 ソース中にコメントしている部分が各要素の説明、 のはずなんですが、私が試すと列の数が余ります。(なんじゃ、そりゃ) どこかに隠れキャラがいます!
…後で調べることにしましょう…

拡張レビュー分室 top
(first uploaded 1999/07/20 last updated 2003/01/11, MISUMI URANO)