シリアライズ
タイトルの処理は非常に簡単です。
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のライブラリのバージョンには注意が必要です。
以上、サンプルになりますが、
逆にクライアント側で更新したレコードセットをシリアライズし、サーバへポストして
更新系のアプリケーションも作成することも可能でしょう。