トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

ODBC

Table of Contents

 はじめに

なんとなく,それらしく動いた感じなので書いておく。とりあえず,OLE ライブラリをロードしておく。

(require "ole")

 データベース接続

ADO 接続オブジェクト作成する。

(setq conn (ole-create-object "ADODB.Connection"))

SQLite3

DSN を使用してデータベースに接続する。

(ole-method conn 'Open "DataSourceName;")

接続情報を指定してデータベースに接続する場合。

(ole-method conn 'Open "driver=SQLite3 ODBC Driver;database=D:\\work\\hoge.db;")

メモリ上のデータベースに接続する場合。

(ole-method conn 'Open "driver=SQLite3 ODBC Driver;database=:memory:;")

ORACLE

DSN を使用してデータベースに接続する。

(ole-method conn 'Open "dsn=DataSourceName;uid=User;pwd=Password;")

接続情報を指定してデータベースに接続する場合。

(ole-method conn 'Open (concat "driver={Microsoft ODBC for Oracle};"
                               "connectstring=ServiceName;uid=User;pwd=Password;"))

MySQL

DSN を使用してデータベースに接続する。

(ole-method conn 'Open "dsn=DataSourceName;uid=User;pwd=Password;")

接続情報を指定してデータベースに接続する場合。

(ole-method conn 'Open (concat "driver={MySQL ODBC 3.51 Driver};"
                               "server=ServerName;database=DBN;uid=User;pwd=Password;"))

 SQL実行

レコードセットオブジェクトを作成し,SQL文を実行する。

(setq rs (ole-create-object "ADODB.Recordset"))
(ole-method rs 'Open "SELECT huga FROM piyo" conn)

レコードセットオブジェクトを作成しつつ,SQL文を実行する。

(setq rs (ole-method conn 'Execute "SELECT huga FROM piyo"))

 データ取得

1 列目の値を取得する。

(setq *val* #{rs.Fields[0].Value})
;; or
(setq *val* (ole-getprop (ole-getprop rs 'Fields 0) 'Value))

"ContactName" 列の値を取得する。

(setq *val* #{rs.Fields["ContactName"].Value})
;; or
(setq *val* (ole-getprop (ole-getprop rs 'Fields "ContactName") 'Value))

列番号を指定してTAB区切りで全行出力する。

(with-output-to-temp-buffer("*odbc*")
  (while (not #{rs.EOF})
    (format t "~A\t~A\n"
            #{rs.Fields[0].Value}
            #{rs.Fields[1].Value})
    (ole-method rs 'MoveNext)))

列名を指定してTAB区切りで全行出力する。

(with-output-to-temp-buffer("*odbc*")
  (while (not #{rs.EOF})
    (format t "~A\t~A\n"
            #{rs.Fields["ContactName"].Value}
            #{rs.Fields["Country"].Value})
    (ole-method rs 'MoveNext)))

全行全列をTAB区切りで出力する。

(let ((dat ""))
  (while (not #{rs.EOF})
    (ole-for-each (row #{rs.Fields})
      (setq dat (concat dat (format nil "~s\t" #{row.Value}))))
    (setq dat (concat (string-right-trim "\t" dat) "\n"))
    (ole-method rs 'MoveNext))
  dat)

 Excelに送る

取得したデータを Excel に出力する。

(let (app workbook worksheet)
  (setq app (ole-create-object "Excel.Application"))
  ;;Excel 起動
  (setf (ole-method app 'Visible) t)
  ;;ワークブック追加
  (setq workbook (ole-method (ole-method app 'Workbooks) 'Add))
  ;;ワークシート1をセット
  (setq worksheet (ole-method workbook 'Worksheets 1))
  (ole-method (ole-method worksheet 'Range "A1") 'CopyFromRecordset rs)
  )

 トランザクション

トランザクションを開始する。

(ole-method conn 'Execute "BEGIN;")

コミットする。

(ole-method conn 'Execute "COMMIT;")

ロールバックする。

(ole-method conn 'Execute "ROLLBACK;")

など,テキトウに。

 終了処理

レコードセットを閉じる。

(ole-method rs 'Close)

データベースから切断する。

(ole-method conn 'Close)

 Sample

メモリ上に SQLite3 データベースを作成後,データを追加&検索して新しいバッファに出力する。

最終更新時間:2009年03月18日 07時08分49秒 GMT