SQLの窓

2014年03月31日


VBScript +ADO / MDB から SQLite3 へ ODBC ドライバを使ってフィールドオブジェクトを使用した同一フォーマットのテーブル間のデータコピー(データベースは自動的に作成されます)

概要

ADO で昔からよく使われる常套手段です。

件数が多いと結構時間がかかるので、そのような処理には向いていません。現在のレコードを同様のフォーマットのログテーブル等へコピーするような一回に数十件の処理に向いています

▼ 販売管理B( hanbaib.zip )


ODBC ドライバを SQLite ODBC Driver からダウンロードしてこのデータを使って、VBScript を実行(DBのパスはご自分の環境に合わせて正しく変更して下さい)するだけで、SQLite3 のデータベースを作成する事ができます。

表名と列名を日本語のままでも作成して、SQL でアクセスできますが、ADO を使ってテーブル名を取得すると化けるので英数字に変更しています。作成後は、ODBCアドミニストレータで DSN を作成すれば、一般的な ODBC 経由のソフトウェアでアクセスが可能になります。

▼ 重要
SQLite ODBC Driver は、VBScript 上の SHIFT_JIS 環境から実行して、SQLite 内に UTF-8 のデータを保存します。VBScript(SHIFT_JIS) からの ADO の通常テーブルアクセスは正しく変換して実行してくれますが、ADO の OpenSchema経由で表名や列名を取得しようとすると、SHIFT_JIS へ戻さないというバグがあります。
内部確認用ツール VBScript + ADO : 汎用CSV出力 ▼ DSN 登録 出力結果
kubun,code,name,num1,num2,create_date,update_date
1,0,男,10,10,2004/05/05,2004/05/05
1,1,女,11,12,2004/05/05,2004/05/05
2,0001,営業部第一,0,0,2004/05/05,2004/05/05
2,0002,営業部第ニ,0,0,2004/05/05,2004/05/05
2,0003,営業部第三,0,0,2004/05/05,2004/05/05
3,0,通常,0,0,2004/06/23,2004/06/23
3,1,特別,0,0,2004/06/23,2004/06/23
4,0,通常,0,0,2004/06/23,2004/06/23
4,1,特別,0,0,2004/06/23,2004/06/23
5,A,食品,0,0,2004/06/23,2004/06/23
5,B,装飾,0,0,2004/06/23,2004/06/23
5,D,衣類,0,0,2004/06/23,2004/06/23
5,G,娯楽,0,0,2004/06/23,2004/06/23
5,K,家庭一般,0,0,2004/06/23,2004/06/23
5,M,薬,0,0,2004/06/23,2004/06/23
5,P,パソコン,0,0,2004/06/23,2004/06/23
5,Z,雑貨,0,0,2004/06/23,2004/06/23


' 使用する ODBC ドライバです
strDriver = "{SQLite3 ODBC Driver}"

' ************************************************
' 処理用文字列設定
' ************************************************
' MDB の接続文字列
strConnectMdb = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\user\lightbox\sqlite3\hanbaib\販売管理B.mdb;"
strConnectSQLite3 = _
"Provider=MSDASQL;Driver="&strDriver&";DATABASE=C:\user\lightbox\sqlite3\hanbaib\db1.sqlite3;"

' ************************************************
' 初期処理
' ************************************************
Set Cn = CreateObject("ADODB.Connection")
Cn.CursorLocation = 3
Set Rs = CreateObject( "ADODB.Recordset" )

Set Cn2 = CreateObject("ADODB.Connection")
Cn2.CursorLocation = 3
Set Rs2 = CreateObject( "ADODB.Recordset" )
Rs2.LockType = 3	' 更新用レコードセット

Cn.Open strConnectMdb
Cn2.Open strConnectSQLite3

' ************************************************
' コード名称マスタ
' ************************************************
Query = _
"create table code_name (" & _
"	kubun INT" & _
"	,code VARCHAR(10)" & _
"	,name NVARCHAR(50)" & _
"	,num1 INT" & _
"	,num2 INT" & _
"	,create_date DATETIME" & _
"	,update_date DATETIME" & _
"	,primary key(kubun,code)" & _
")"
Call SSTransfer( "code_name", Query )

' ************************************************
' 終了
' ************************************************

Cn2.Close
Cn.Close

Wscript.Echo "処理が終了しました"

' ************************************************
' SQLLite 転送
' ************************************************
function SSTransfer( strTable, QueryCreate )

	Wscript.Echo strTable & " の作成を開始します"

	Dim Query

	' まず既存テーブルを削除
	Query = "drop table " & strTable
	RunSS( Query )

	' CREATE 文でテーブル作成
	RunSS( QueryCreate )

	' MDB 側はすべてのレコード
	' SQLite 側は空
	Query = "select * from " & strTable
	Rs.Open "select * from コード名称マスタ", Cn
	Rs2.Open Query, Cn2

	' フィールド数
	nCount = Rs.Fields.Count
	Do While not Rs.EOF

		' SQLite 側に新しいレコードバッファを作成
		Rs2.AddNew

		' 同一フォーマットなのでフィールド番号でループ
		For I = 0 to nCount - 1
			' 対応するデータを MDB から SQLite へコピー
			Rs2.Fields(I).Value = Rs.Fields(I).value
		Next
		' SQLite の更新
		Rs2.Update

		' MDB を次のレコードへ
		Rs.MoveNext
	Loop

	' レコードセットを閉じる
	Rs2.Close
	Rs.Close

	Wscript.Echo strTable & " の作成が終了しました"

end function

' ************************************************
' SQLLite 実行
' ************************************************
function RunSS( Query )

	on error resume next
	Cn2.Execute Query
	if Err.Number <> 0 then
		Wscript.Echo Err.Description
	end if
	on error goto 0

end function


以下は簡単に更新する為に SQLの窓 Build C++ を使っての手順です。

Excel の接続ダイアログ

DSN を作成した後、Excel の接続ダイアログにある『他のDSN』に入力します。



更新用のキーを設定

テーブル名をダブルクリックすると、データ処理用のウインドウが開くので更新用のキーを設定します。この処理では、ODBC 一般用なので、ウインドウを開くたびにキーの設定がその都度必要です。



入力した後更新できます




関連する記事

posted by lightbox at 2014-03-31 20:43 | VBS + ADO | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり