 
odbc.rbは、Ruby用のODBCライブラリです。Windows上で動作します。
      動作確認は、ruby 2.0.0p195 (ActiveScriptRuby)で行っています。
      odbc.rbのダウンロード(odbcV115_rb20.lzh)
      odbc.rbのダウンロード(odbcV114_rb19.lzh)
   
Odbcクラス odbc用クラスです。
データソースへの接続は、connectまたは、driverConnectを使用します。
| キーワード | 内容 | 
|---|---|
| DSN | データソース名 | 
| UID | ユーザID | 
| PWD | パスワード | 
ウインドウハンドルを指定し、fdrvにSQL_DRIVER_PROMPTを指定するとデータソース選択ダイアログが表示されます。 その場合、sConStrは、""または、"DSN=dsnname"の形式が指定出来ます。
| col no. | 項目 | 内容 | 
|---|---|---|
| 0 | TABLE_CAT | カタログ名(データベース名)または、nil | 
| 1 | TABLE_SCHEM | TABLE_NAMEの入ったスキーマの名前または、nil | 
| 2 | TABLE_NAME | テーブル名、ビュー名または、別名 | 
| 3 | TABLE_TYPE | 「TABLE」、「VIEW」または、「SYSTEM TABLE」 | 
| 4 | REMARKS | テーブルに関する情報または、nil | 
| col no. | 項目 | 内容 | 
|---|---|---|
| 0 | TABLE_CAT | カタログ名(データベース名)または、nil | 
| 1 | TABLE_SCHEM | スキーマ名または、nil | 
| 2 | TABLE_NAME | テーブル名、ビュー名または、別名 | 
| 3 | COLUMN_NAME | 列名 | 
| 4 | DATA_TYPE | 列のデータタイプ | 
| 5 | TYPE_NAME | 列のデータタイプ名 | 
| 6 | COLUMN_SIZE | カラムのデータサイズ | 
| 7 | BUFFER_LENGTH | 列データ取得バッファサイズ | 
| 8 | DECIMAL_DIGITS | 列のスケールまたは、nil | 
| 9 | 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」 | 
作成例 odbcd = Odbc.new(__ENCODING__)
引数に文字のエンコーディング「__ENCODING__」を指定します。シフトJIS(magic comment:「Windows-31j」,「shift_jis」)とUTF-8が有効です。
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"
 | 
履歴