VBScript + ADO : 汎用CSV出力

  ODBC の動的接続





Adocsv

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

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

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

Adocsv2

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

idx = document.getElementById("odbclist").selectedIndex

strDriver = "{" & document.getElementById("odbclist").options(idx).text & "}"
strServer = document.getElementById("p03").value
strUser = document.getElementById("p01").value
strPass =  document.getElementById("p02").value
strTable =  document.getElementById("p04").value
strDb =  document.getElementById("db_name").value
strFile =  document.getElementById("db_file").value

ConnectionString = _
	"Provider=MSDASQL" & _
	";Driver=" & strDriver

if strFile <> "" then
	ConnectionString = ConnectionString & ";Dbq=" & strFile
end if
if strServer <> "" then
	ConnectionString = ConnectionString & ";Server=" & strServer
end if
if strDb <> "" then
	ConnectionString = ConnectionString & ";Database=" & strDb
end if
if strUser <> "" then
	ConnectionString = ConnectionString & ";UID=" & strUser
end if
if strPass <> "" then
	ConnectionString = ConnectionString & ";PWD=" & strPass
end if

ConnectionString = ConnectionString & ";"

if document.getElementById("connectopt").value <> "" then
	ConnectionString = _
		ConnectionString & document.getElementById("connectopt").value & ";"
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 では、スキーマ取得という処理があるのでそれを利用します。

' **********************************************************
' 接続
' **********************************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	alert( Err.Description )
	Exit Function
end if
on error goto 0

if document.getElementById("connectsql").value <> "" then
	on error resume next
	Cn.Execute(document.getElementById("connectsql").value)
	if Err.Number <> 0 then
		alert( Err.Description )
		Cn.Close
		Exit Function
	end if
	on error goto 0
end if

' **********************************************************
' レコードセット取得
' **********************************************************
on error resume next
Set Rs = Cn.OpenSchema(20)
if Err.Number <> 0 then
	Cn.Close
	alert( Err.Description )
	Exit Function
end if
on error goto 0

' **********************************************************
' データ作成
' **********************************************************
Buffer = ""
Do While not Rs.EOF
	Buffer = Buffer & "<option value=""" & Rs.Fields(2).Value
	Buffer = Buffer & """>"
	Buffer = Buffer & Rs.Fields(2).Value
	Buffer = Buffer & "</option>"
	Rs.MoveNext
Loop

' **********************************************************
' レコードセットクローズ
' **********************************************************
Rs.Close

' **********************************************************
' 接続解除
' **********************************************************
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ライブラリ