2014年7月6日日曜日

[MS Access] VBScript を使ってデータベースアクセス

VBScript から Microsoft Access へ接続する場合は、VBA とほぼ同等のコードで実装できるが、VBScript の言語使用として若干注意することがある、それは
  • データ型は全てバリアント型
  • On Error GoTo は使用できない
データ型については、As Integerみたいなデータ型定義を付けられないことになる。エラー処理については、ステップ毎にエラーチェックすることになるので、やはり面倒です。エラーチェックを関数にまとめてもステップ毎に洩れなく確認することには変わりないので、あまり複雑な処理を VBScript でやるのは辛いです。

VBScript のデータ型
http://msdn.microsoft.com/ja-jp/library/cc392195.aspx
VBScript では、バリアント型 (Variant) と呼ばれるデータ型のみを使用します。

VBScript でのエラー処理
http://msdn.microsoft.com/ja-jp/library/cc407944.aspx
VBScript で On Error GoTo は使用できません。次の例に示すように、その代わりに On Error Resume Next を使用し、その後、Errors コレクションの Err.Number プロパティと Count プロパティの両方を調べます。

VBScript から Microsoft Access へ接続して、SELECT文を実行するサンプルです。
Option Explicit

Function GetNow()
    Dim Engine, Database, Recordset

    On Error Resume Next

    Set Engine = CreateObject("DAO.DBEngine.120")
    If Err.Number <> 0 Or Engine.Errors.Count > 0 Then
        WScript.Echo Err.Number & vbTab & Err.Source & vbTab & Err.Description
        GetNow = False
        Exit Function
    End If

    Set Database = Engine.OpenDatabase("C:\work\SAMPLE1.mdb")
    If Err.Number <> 0 Or Engine.Errors.Count > 0 Then
        WScript.Echo Err.Number & vbTab & Err.Source & vbTab & Err.Description
        GetNow = False
        Exit Function
    End If

    Set Recordset = Database.OpenRecordset("SELECT now")  ' システム時刻nowのみ
    If Err.Number <> 0 Or Engine.Errors.Count > 0 Then
        WScript.Echo Err.Number & vbTab & Err.Source & vbTab & Err.Description
        GetNow = False
        Exit Function
    End If

    WScript.Echo Recordset(0)
    GetNow = True
End Function

if GetNow then
    WScript.Quit(0)
Else
    WScript.Echo "異常終了しました。"
    WScript.Quit(1)
End If

実行方法は、CScript [File Name].vbs