VBAの最近の情報



シリアライズ

タイトルの処理は非常に簡単です。

ADODB.Recordset.Save "filename.xml", adPersistXML

ADODB.Recordset.Open "filename.xml"

これでレコードセットのXMLデータでのシリアライズ・デシリアライズはOK

 

それではシリアライズをどのように利用するかについてですが、

前の記事で書いたように、サーバからWebサービスとしてXMLデータを受信し、

クライアント側でデシリアライズしてレコードセットを生成し利用するということです。

(参考)COMを利用しJavaからADO接続してデータをXML出力

 

このことにより、クライアント側直接RDB(データベース)に接続する環境がなくても、

ADOのレコードセットの機能を使用して開発を行うことが可能です。

またクライアントもADOが利用できるツールであれば何でもOKなので、クライアント側

の選択肢も広がります(VBをはじめ、Excel等のVBA、Delphi、etc)

 

プログラミング

それでは、サーバにHTTPリクエストにてSQLを送信し、結果をXMLデータで受取り、

レコードセットに変換する処理を書いてみます(実際に動作させて検証OKのものです)

クライアントにはExcelを利用し、VBAでコードを記述しています。

 

Private Sub cmdRun_Click()
  'XMLHTTPオブジェクトの生成
  Dim oXmlHttp As Object
  Set oXmlHttp = CreateObject("MSXML2.XMLHTTP")
 
  'リクエストデータの準備
  oXmlHttp.Open "POST", "http://tomcat:8080/app/xml.jsp", False
  oXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
 
  'パラメータを送信して実行
  oXmlHttp.send UrlEncode("sql=" + Cells(1, 1).Value)
 
  '結果確認
  If (oXmlHttp.readyState = 4) And (oXmlHttp.Status = 200) Then
    '成功
    Dim RS As ADODB.Recordset
    Call GetRecordset(RS, oXmlHttp.responseText)
    Call Cells(2, 1).CopyFromRecordset(RS)
  Else
    'エラー
    MsgBox "エラーです。HTTP Status Code : " & oXmlHttp.Status
  End If
End Sub

'パラメータをUTF8でエンコードする
Public Function UrlEncode(ByVal sText As String) As String
    If Len(sText) = 0 Then Exit Function
    With CreateObject("ScriptControl")
        .Language = "JScript"
        UrlEncode = .CodeObject.encodeURI(sText)
    End With
End Function

'XMLデータからレコードセット生成
Public Sub GetRecordset(RS As ADODB.Recordset, sXml As String)
  Dim oStream As ADODB.Stream
  Set oStream = New ADODB.Stream
  oStream.Open
  oStream.WriteText sXml
  STR.Position = 0
  Set RS = New ADODB.Recordset
  RS.Open oStream
End Sub

 

  • 配置したボタンをクリックすると、XmlHttpオブジェクトを使用し、サーバーへ
    セル"A1"に書かれたSQL文をPOSTデータで送ります。
    POSTデータはUTF8でエンコードします。
  • レスポンスで受け取ったXMLデータをADODB.Streamオブジェクトを利用し、
    レコードセットを生成しています。
  • 生成されたレコードセットのデータを、セル"A2"へコピーしています。

※POSTするSQL文はSELECT文のみ考慮しており、セキュリティ対策等は特に考慮

していないので実際に類似の運用を行う場合は十分考慮することが必要です。

※ADODB.StreamオブジェクトはADO2.5から追加されたオブジェクトなので、

ADOのライブラリのバージョンには注意が必要です。

 

以上、サンプルになりますが、

逆にクライアント側で更新したレコードセットをシリアライズし、サーバへポストして

更新系のアプリケーションも作成することも可能でしょう。