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







yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[vbsguide]
CCBot/2.0 (https://commoncrawl.org/faq/)
25/05/25 10:08:39
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube