テクセル
Ruby用ODBCライブラリ(Windows用)

odbc.rbは、Ruby用のODBCライブラリです。Windows上で動作します。 動作確認は、ruby 2.0.0p195 (ActiveScriptRuby)で行っています。
odbc.rbのダウンロード(odbcV115_rb20.lzh)
odbc.rbのダウンロード(odbcV114_rb19.lzh)

Odbcクラス odbc用クラスです。

アクセサ

iwksize
ワークサイズ(バイト数)の設定、取得を行います。初期値:1024バイト
sconstr
driverConnectで接続した時に取得した接続文字列

クラスメソッド

connect(sDsn,sUid,sPwd)
データソースへの接続を行います。
sDsn
データソース名
sUid
ユーザー識別コード
sPwd
パスワード
戻り値
正常時:0 、接続失敗時:0以外

データソースへの接続は、connectまたは、driverConnectを使用します。

driverConnect(sConStr,whnd,fdrv)
データソースへの接続を行います。
sConStr
接続文字列を指定します。接続文字列は、「キーワード=値」の形式で指定します。 「;」区切りで複数指定出来ます。
キーワードの例
キーワード 内容
DSN データソース名
UID ユーザID
PWD パスワード
whnd
ウインドウハンドル。省略可、指定しない場合は、0
fdrv
接続ダイアログ ボックスの表示指定を行います。以下の値が指定可能です。省略可、指定しない場合は、SQL_DRIVER_NOPROMPT(表示しない)
  • SQL_DRIVER_NOPROMPT
  • SQL_DRIVER_COMPLETE
  • SQL_DRIVER_PROMPT
  • SQL_DRIVER_COMPLETE_REQUIRED
戻り値
正常時:0 、接続失敗時:0以外

ウインドウハンドルを指定し、fdrvにSQL_DRIVER_PROMPTを指定するとデータソース選択ダイアログが表示されます。 その場合、sConStrは、""または、"DSN=dsnname"の形式が指定出来ます。

disconnect
データソースから切断します。
戻り値
なし
execdirect(ssql)
SQLを実行します。
ssql
SQL文字列
戻り値
正常時:0 、異常時:0以外の値
getData
結果の1行(1レコード)データを配列として取得します。複数行ある場合は、次の行にカーソルが移動します。
戻り値(ir,ardtの2変数)
ir   正常時:0、 データ無し:-1、 異常時:0,-1以外の値
ardt 1行(1レコード)データの配列
describeCol
SELECTステートメントによる結果データの列名を配列として取得します。
戻り値(ir,ardtの2変数)
ir   正常時:0、 異常時:0以外の値
ardt 列名の配列
tableList
現在選択中データベースのテーブル一覧を2次元配列として取得します。
戻り値(ir,ardtの2変数)
ir   正常時:0、 異常時:0以外の値
ardt テーブル一覧の配列
1行の内容は、以下となります。
col no. 項目 内容
TABLE_CAT カタログ名(データベース名)または、nil
TABLE_SCHEM TABLE_NAMEの入ったスキーマの名前または、nil
TABLE_NAME テーブル名、ビュー名または、別名
TABLE_TYPE 「TABLE」、「VIEW」または、「SYSTEM TABLE」
REMARKS テーブルに関する情報または、nil
tableColumns(sCatalogName,sSchemaName,sTblName)
指定されたテーブルの列情報を取得します。
sCatalogName
カタログ名(サーバ名)
sSchemaName
スキーマ前
sTblName
テーブル名
戻り値(ir,ardtの2変数)
ir   正常時:0、 異常時:0以外の値
ardt 列名の配列
1行の内容は、以下となります。
col no. 項目 内容
TABLE_CAT カタログ名(データベース名)または、nil
TABLE_SCHEM スキーマ名または、nil
TABLE_NAME テーブル名、ビュー名または、別名
COLUMN_NAME 列名
DATA_TYPE 列のデータタイプ
TYPE_NAME 列のデータタイプ名
COLUMN_SIZE カラムのデータサイズ
BUFFER_LENGTH 列データ取得バッファサイズ
DECIMAL_DIGITS 列のスケールまたは、nil
NUM_PREC_RADIX 10(正確な数値タイプ)、2(近似値タイプ)または、nil
10 NULLABLE 列が NULL を受け入れない場合は SQL_NO_NULLS(0)。列が NULL 値を受け入れる場合は SQL_NULLABLE(1)。
11 REMARKS 記述情報または、nil
12 COLUMN_DEF 列のデフォルト値または、nil
13 SQL_DATA_TYPE データタイプ
14 SQL_DATETIME_TYPE 日時データ・タイプのサブタイプ・コード。SQL_CODE_DATE(0)、SQL_CODE_TIME(1)、SQL_CODE_TIMESTAMP(2)または、nil
15 CHAR_OCTET_LENGTH 文字データタイプの場合はオクテット単位の最大長。それ以外は、nil
16 ORDINAL_POSITION 表中の列の順序 1~
17 IS_NULLABLE NULL可能でない場合は「NO」、それ以外は、「YES」
getErr
診断情報を取得します。他のメソッド呼び出しの戻り値が異常値の場合に取得します。
戻り値
メッセージ文字列

インスタンスの作成

作成例 odbcd = Odbc.new(__ENCODING__)

引数に文字のエンコーディング「__ENCODING__」を指定します。シフトJIS(magic comment:「Windows-31j」,「shift_jis」)とUTF-8が有効です。


参考 Excelファイルをデータベースとして使う

Excelファイルをデータベースとして使用出来ます。Excel表の1行目が列名となり、 2行目以降がデータとなります。また、シート名がテーブル名となります。(例:[Sheet1$])
接続はdriverConnectを使用し接続文字列sConStrにWindowsで用意されているExcel用ドライバと 接続するExcelファイル名を指定します。キーワードReadOnly=0でデータの追加、更新が可能となります。

# -*- coding: utf-8 -*-
# ODBC->Excel
require "./odbc"

class ExcelOdbc < Odbc

   def initialize

      super(__ENCODING__)
   end

   def execQuery(sSQL)
   
      ir = execdirect(sSQL)
      if ir != 0
         sa = "ODBC Excel SQL error¥r¥n" + getErr + "¥r¥n[" + sSQL + "]¥r¥n"
         print sa
         disconnect
         exit
      end
      return ir
   end

end

exceldb = ExcelOdbc.new

#sconstr = "Driver={Microsoft Excel Driver (*.xls)};" +
sconstr = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" +
          "dbq=" + __dir__ + "¥¥exlodbc0.xlsx;ReadOnly=0"
ir = exceldb.driverConnect(sconstr)

if ir != 0
   print "接続エラー " + ir.to_s + "¥r¥n"
   print exceldb.getErr
   exit
end

sSQL = "CREATE TABLE [Sheet1$] (id int, tda DATE, cnote TEXT)"
exceldb.execQuery(sSQL)

sSQL = "SELECT max(id) FROM [Sheet1$]"
exceldb.execQuery(sSQL)
ir,ardt = exceldb.getData
id = 0
if ir != -1
   if ardt[0] != nil
      id = ardt[0].to_i
   end
end
id += 1

sSQL = "INSERT INTO [Sheet1$] VALUES (" +
       id.to_s + ",'" +
       Time.now.strftime("%Y-%m-%d %H:%M:%S") + "'," +
       "'日本ニホン123abc①Ⅱ')"
exceldb.execQuery(sSQL)                #データ書き込み

print "データ表示¥r¥n"
sSQL = "SELECT TOP 5 * FROM [Sheet1$] ORDER BY id DESC"
exceldb.execQuery(sSQL)
ir,ardt = exceldb.describeCol
print ardt[0] + "," + ardt[1] + "," + ardt[2] + "¥r¥n"
while true do
   ir,ardt = exceldb.getData
   if ir == -1
      break
   end
   print ardt[0] + "," + ardt[1] + "," + ardt[2] + "¥r¥n"
end

#sSQL = "DELETE FROM [Sheet1$] WHERE id = 1"  <-- エラー
#sSQL = "UPDATE [Sheet1$] SET cnote = 'テクセル12ab' WHERE id = 1"
#exceldb.execQuery(sSQL)

exceldb.disconnect
print "終了¥r¥n"

履歴

2013.06 Ver.1.15 メソッドdriverConnect、アクセサsconstr追加
2013.06 Ver.1.14 メソッドgetErrの不具合対策、Ruby2.0対応
2012.10 Ver.1.13 メソッドgetData,describeCol,tableList,tableColumnsの仕様変更
2012.05 Ver.1.12 tableColumnsメソッド追加
2012.03 Ver.1.11 tableListメソッドの仕様変更、iwksizeアクセサ追加、magic comment:「Windows-31j」に対応
2011.10 Ver.1.10 getErrメソッド追加
2011.08 Ver.1.00

odbc.rbの使用例(mdb,accdbファイル)

Rubyユーティリティ
©2011-2013 TEXCELL CORPORATION