web-dev-qa-db-ja.com

JSONフィードをMS Accessに自動的に解析する

私の会社には、2時間ごとにMS Accessデータベースにロードする必要があるデータのJSONフィードを提供するベンダーがあります。する必要がある:

  1. フィードからデータを読み込み、
  2. jSONを解析してAccessで使用できる形式にしてから、
  3. データベースに挿入します。

私は遭遇しました この質問 同様の問題について話し合っていますが、MS Accessでこれを実装する方法についての良い説明はありません。助けてくれてありがたいです!

7
Martin O'Neill

VBA JSON ライブラリを使用すると、JSON形式のファイルをMS Accessにインポートできます。 JSONデータを辞書のコレクションと見なし、Visual Basicは collection および dictionary をデータ構造として提供します。

手順は次のとおりです。

  1. 予想されるJSONデータの構造に一致するテーブルを作成する
  2. VBA IDE MS Accessの側で、JsonConverter.bas(上記のリンクから)を新しいモジュールにインポートします
  3. 引き続きIDEの[ツール]/[参照]で、VBAリファレンスを確認します:Microsoft Scripting Runtime
  4. JSONテキストファイルを読み取り、それを辞書のコレクション(キーとvaleusを含む)として解析し、値をAccessテーブルに繰り返し追加する次のコードを含めます。 Accessフォームまたはモジュールの背後にコードを配置します(例では1つのネストされたレベルのJSONファイルを使用しています)

[〜#〜] json [〜#〜]

[
  {
    "col1": somenumber,
    "col2": "somestring",
    "col3": "somestring",
    "col4": "somestring",
    "col5": "somestring"
  }
]

VBAコード

Private Function JSONImport()
    Dim db As Database, qdef As Querydef
    Dim FileNum As Integer
    Dim DataLine As String, jsonStr As String, strSQL As String
    Dim p As Object, element As Variant        

    Set db = CurrentDb

    ' READ FROM EXTERNAL FILE
    FileNum = FreeFile()
    Open "C:\Path\To\JsonFile.json" For Input As #FileNum

    ' PARSE FILE STRING
    jsonStr = ""
    While Not EOF(FileNum)
        Line Input #FileNum, DataLine

        jsonStr = jsonStr & DataLine & vbNewLine
    Wend
    Close #FileNum
    Set p = ParseJson(jsonStr)

    ' ITERATE THROUGH DATA ROWS, APPENDING TO TABLE
    For Each element In p
        strSQL = "PARAMETERS [col1] Long, [col2] Text(255), [col3] Text(255), " _
                          & "[col4] Text(255), [col5] Text(255); " _
                  & "INSERT INTO TableName (col1, col2, col3, col4, col5) " _
                          & "VALUES([col1], [col2], [col3], [col4], [col5]);"

        Set qdef = db.CreateQueryDef("", strSQL)

        qdef!col1 = element("col1")
        qdef!col2 = element("col2")
        qdef!col3 = element("col3")
        qdef!col4 = element("col4")
        qdef!col5 = element("col5")

        qdef.Execute
    Next element

    Set element = Nothing
    Set p = Nothing
End Function
7
Parfait