« 受付開始 | トップページ | 日付・時刻型の憂鬱 »

2007年10月19日 (金)

データ型のマップ

息抜きがてらに、色々な事をやっていて、少しづつ、DB2 CLI/ODBCを使った接続アプリのサンプルを作っていたのだが、ある程度動くようになってきた。こんな感じに

Db2emp_2

上のテキストボックスに入力したSQL文の実行結果が下のグリッドに表示されるという、基本的なプログラムであるが・・グリッド上でデータを編集して、反映ボタンを押すと、変更内容がサーバー上のデータベースに反映される。ちなみに、上の画像はDB2にあらかじめ用意されているSAMPLEデータベースのEMPLOYEEテーブルの内容である。プログラムの作成中に一番悩んだのは、データ型の変換・マップの仕方である。通常、DB2に限らずデータベースにアプリケーションからアクセスする場合、データベース側のデータ型とアプリケーション開発環境で用意されているデータ型は1対1に対応しないので、何かしらの変換が必要になる。例えば、DB2で使用できる組み込みデータ型には以下のものがある。

  • SMALLINT(SQL_SMALLINT)
  • INTEGER(SQL_INTEGER)
  • BIGINT(SQL_BIGINT)
  • DECIMAL/NUMERIC(SQL_DECIMAL)
  • REAL(SQL_FLOAT)
  • DOUBLE/FLOAT(SQL_DOUBLE)
  • CHAR(SQL_CHAR)
  • VARCHAR(SQL_VARCHAR)
  • LONG VARCHAR(SQL_LONGVARCHAR)
  • CLOB(SQL_CLOB*)
  • GRAPHIC
  • VARGRAPHIC
  • LONG VARGRAPHIC
  • DBCLOB
  • BLOB(SQL_BLOB*)
  • DATE(SQL_TYPE_DATE)
  • TIME(SQL_TYPE_TIME)
  • TIMESTAMP(SQL_TYPE_TIMESTAMP)

上記の括弧()内はDB2 CLI/ODBCでのデータ型である。例えば、DB2のINTEGER型の列は、DB2 CLI/ODBCを使って、その列の型を問い合わせるとODBCの標準データ型であるSQL_INTEGERとして報告される。また、LOB型のSQL_CLOB,SQL_BLOBはODBCの標準データ型ではなく、DB2独自のデータ型なので*(アスタリスク)をつけた。また、DB2のLOB型はDB2 CLIの設定ファイルであるdb2cli.iniにLongDataCompat=1というエントリを追加すると、LOB型はODBCの標準データ型であるSQL_LONGVARCHARやSQL_LONGVARBINARYとして報告されるようになる。

で、問題は、これらのデータベース側のデータ型のデータをアプリケーションが取り出すときに、どうアプリケーション側のデータ型にマップするかで、頭を悩まされる。例えば、DB2のINTEGER型(SQL_INTEGER)は4バイトの整数を表す型で、今時の開発環境では組み込みのデータ型として4バイトの整数を表す型、C言語で言えば、処理系に依存するかもしれないが一般的にlong型が用意されているので、そのまま取り出せる。また、4バイトの整数としてではなく、文字列(char *)として取り出せることもできるが、その場合、4バイトの整数を文字列として表現し格納できるだけの十分な領域を確保しないと、切り捨てが発生する(符号付き4バイト整数の場合、-21億から+21億の値を表現できるので、符号も含めて最低12バイト。小数部を持つデータ型の場合、小数点も考慮にいれなければいけない)。ちなみに、これらの変換はサポートされていればドライバまたはドライバマネージャがやってくれる。

とまぁ、INTEGER型ならいいが、DECIMAL型とか巨大な数を扱う場合、文字列にマップしないと切り捨られる可能性があるので、色々、効率を考慮すると面倒なのである。すべての数値型を文字列にマップすればあまり考え込む必要はないが・・(マイクロソフトのODBCのヘルプにデフォルトのデータ型のマップの表があるので、それを参考にすれば、あまり悩む必要はないかもしれない。)

ちなみに、作っているサンプルプログラムはDB2のLOB型(SQL_CLOB,SQL_BLOB)やグラッフィクストリングにはまだ対応していない。上記の表で、グラフィックストリング型がODBCのどのデータ型にマップされているかはまだ調べていない(SQL_WCHAR?SQL_BINARAY?)。

« 受付開始 | トップページ | 日付・時刻型の憂鬱 »

DB2」カテゴリの記事

Oracle」カテゴリの記事

データベース」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/39651820

この記事へのトラックバック一覧です: データ型のマップ:

« 受付開始 | トップページ | 日付・時刻型の憂鬱 »

自作ソフトウェア

無料ブログはココログ

メモ