VBScript + ADO : 汎用CSV出力

  ODBC の動的接続





Adocsv

IE8 では、TYPE=FILE で入力不可になっていたので、テキストフィールドを重ねて使っています。データの転送は、onchange イベントで転送している為、同じファイルを選択すると、転送されないので注意して下さい。

ADO を使って、select 文より自動的に CSV を出力するのはそんなに難しくありませんが、アプリケーションとして成り立たせる為に、いちいち DSN を作成せずに、動的に構成する接続文字列を作成する必要があります。

その場合、ODBC ドライバ文字列が必要になるので、レジストリから列挙して取得します。その際 WMI でしか無理ですが、コードは ODBC ドライバの列挙 を参照してください

Adocsv2

接続文字列作成の為のコードは以下のようになります

01.idx = document.getElementById("odbclist").selectedIndex
02. 
03.strDriver = "{" & document.getElementById("odbclist").options(idx).text & "}"
04.strServer = document.getElementById("p03").value
05.strUser = document.getElementById("p01").value
06.strPass =  document.getElementById("p02").value
07.strTable =  document.getElementById("p04").value
08.strDb =  document.getElementById("db_name").value
09.strFile =  document.getElementById("db_file").value
10. 
11.ConnectionString = _
12.    "Provider=MSDASQL" & _
13.    ";Driver=" & strDriver
14. 
15.if strFile <> "" then
16.    ConnectionString = ConnectionString & ";Dbq=" & strFile
17.end if
18.if strServer <> "" then
19.    ConnectionString = ConnectionString & ";Server=" & strServer
20.end if
21.if strDb <> "" then
22.    ConnectionString = ConnectionString & ";Database=" & strDb
23.end if
24.if strUser <> "" then
25.    ConnectionString = ConnectionString & ";UID=" & strUser
26.end if
27.if strPass <> "" then
28.    ConnectionString = ConnectionString & ";PWD=" & strPass
29.end if
30. 
31.ConnectionString = ConnectionString & ";"
32. 
33.if document.getElementById("connectopt").value <> "" then
34.    ConnectionString = _
35.        ConnectionString & document.getElementById("connectopt").value & ";"
36.end if

MSDASQL は、ODBC 用のプロバイダですが、詳細は Microsoft OLE DB Provider for ODBC を参照してください。

接続文字列は、DB 固有のものがありますが、上記コード中の Dbq は、そのうちの一つで、Microsoft 系のファイルとして存在するデーターベース( MDB、Excel ) で使用します。これに関する参考ページはダウンロードの詳細 : 2007 Office system ドライバ: データ接続コンポーネント を参照して下さい。

MySQL では、ODBC 設定ダイアログから HELP を表示するか、MySQL 5.1 Connector/ODBC Connection Parameters を参照します





  DB共通の テーブル一覧の取得



CSV 出力では、テーブル単位で行う事が多いので、テーブルの一覧をコンボボックスに列挙しています。この際、DB依存の SQL等では、違った処理になりますが、ADO では、スキーマ取得という処理があるのでそれを利用します。

01.' **********************************************************
02.' 接続
03.' **********************************************************
04.on error resume next
05.Cn.Open ConnectionString
06.if Err.Number <> 0 then
07.    alert( Err.Description )
08.    Exit Function
09.end if
10.on error goto 0
11. 
12.if document.getElementById("connectsql").value <> "" then
13.    on error resume next
14.    Cn.Execute(document.getElementById("connectsql").value)
15.    if Err.Number <> 0 then
16.        alert( Err.Description )
17.        Cn.Close
18.        Exit Function
19.    end if
20.    on error goto 0
21.end if
22. 
23.' **********************************************************
24.' レコードセット取得
25.' **********************************************************
26.on error resume next
27.Set Rs = Cn.OpenSchema(20)
28.if Err.Number <> 0 then
29.    Cn.Close
30.    alert( Err.Description )
31.    Exit Function
32.end if
33.on error goto 0
34. 
35.' **********************************************************
36.' データ作成
37.' **********************************************************
38.Buffer = ""
39.Do While not Rs.EOF
40.    Buffer = Buffer & "<option value=""" & Rs.Fields(2).Value
41.    Buffer = Buffer & """>"
42.    Buffer = Buffer & Rs.Fields(2).Value
43.    Buffer = Buffer & "</option>"
44.    Rs.MoveNext
45.Loop
46. 
47.' **********************************************************
48.' レコードセットクローズ
49.' **********************************************************
50.Rs.Close
51. 
52.' **********************************************************
53.' 接続解除
54.' **********************************************************
55.Cn.Close

ソースコードの、Cn.OpenSchema(20) の部分がテーブル一覧を取得しているところですが、他の番号でも DB システムの情報を取得する事ができます



  MDB の出力

MDB は、Microsoft Access Driver (*.mdb) を使って「ファイル」のみ設定します
システムテーブルは、環境によってはもっと多く表示されますが無視して下さい

Adocsv_1



  SQLite の出力

SQLite は、SQlite3 で内部は UTF-8 を想定しています。設定するのは SQLite のファイルのみですが、データベースのほうに設定します。日本語のテーブル名を使用すると、VBScript からのスキーマ処理は化けてしまいますので、英数字の時のみテーブル一覧を利用できます。

取得時は化けますが、SQL に日本語テーブル名を指定しても正しく動くので、日本語テーブル名の場合は、テーブルを指定する場合は直接入力するか、SQL 欄で全ての SQL を記述して下さい

テストデータは、販売管理B.mdb のダウンロードページ の SQLite バージョンを使用しています( 日本語テーブル名ですが、英数字に変更するスクリプトを同梱しています )

Adocsv_2






  .txt または .csv を DB として読み込んで再び CSV 出力

このドライバを使うために、対象となる CSV をひとつのディレクトリに保存しておきます。そのディレクトリを、mdb と同じ DBQ に指定するので、CSV をひとつ選択して手動でファイル名を削除してディレクトリ名にします

Test






  Oracle の出力

汎用型なので少し使いづらいのは、テーブル一覧が参照可能な全てのテーブル・ビューとなるため大量のデータが小さなコンボボックスに設定されるので、手入力のほうが効率的かもしれません

Oracle は、他のデータベースと違って、「データベース」の設定は必要ありません。ユーザがその代わりをするからです( スキーマと呼ばれる )


Adocsv_3





  MySQL( 5.14 ) の出力

MySQL のサーバーの charset は UTF-8 です。
そのままでは、スキーマ処理で化けるので「接続追加オプション」で、charset=sjis を指定しています

Adocsv_4













  infoboard   管理者用   





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ