長いタイトルですが
やりたいこととしては、サーバーサイドで表題の処理をおこない、
ADOのレコードセットをクライアントに返したいということです。
ADOのレコードセットのシリアライズ方法にXMLデータを利用します。
ADODB.Recordset
ADOは、Windows環境(ExcelやAccess等のVBA)で多く利用され、
レコードセットのデータを簡単に加工したり、張り付けたりすることができるように
なっています。また、ADOのレコードセットには標準でXMLへの入出力機能があり、
簡単にシリアライズ・デシリアライズ化することができます。
本題
上記のXMLデータを用いて、直接ADO接続でDBMS(Oracle等)に接続する環境が
クライアント側になくても、サーバサイドよりADOのレコードセットをシリアライズした
XMLをクライアント側に返すことで、クライアント側で、ADOのレコードセットを自由に
利用することができるようになるということです。
一種のWebサービスとしての利用と言えます。
COM
それではなぜ、COM(Component Object Model)かというと、もちろん、COMを
利用しなくても、Dom等を用いて、Javaの標準のライブラリでもADO仕様のXMLを
生成することは可能なのですが、サーバーサイドでも同じADOの機能を用いた処理
を行うことで手順がすっきりとし、生成されたXMLデータの互換性もほぼ問題は
発生しないという点、パフォーマンス的にも有利ではないかという点でComを選択
してみました。
※もちろんこの時点でサーバサイドもWindows環境に限定されてしまうことになり
ますが、ADO以外にもComを利用した様々なWebサービスを提供できそうです。
準備
JavaでComの操作をするためのライブラリとしては、JCom(Java-COMブリッジ)を
利用しています。まず、まずComを呼び出すためのNativeのライブラリ、jcom.dll
を、"java.library.path"上に配置します。jcom.dllは上記ライブラリに含まれます。
また、"java.library.path"の確認は、
System.getProperty("java.library.path")
で確認するか、または、
-Djava.library.path=
で設定します。
通常、SystemやSystem32がこれに含まれます。
次に、jcom.jarをライブラリパスに設定し、これでjavaからCOMの操作をする
準備の完了です。
サンプル
以下は、JCom経由でADOにてMSSQLServerに接続し、SQLを発行して
レコードセットを取得します。取得したレコードセットは、Saveメソッドにて、
ファイルに保存します(Saveメソッドの2つめの引数"1"がXML形式での保存を
意味します。
ReleaseManager rm = new ReleaseManager();
try {
//ADOConnectionの作成
IDispatch con = new IDispatch(rm, "ADODB.Connection");
//ConnectionStringの設定
con.put("ConnectionString", "Provider=Sqloledb;Data Source=(local)\\SQLEXPRESS;Initial Catalog=dbname;Connect Timeout=15;user id=sa;password=");
//データベースへ接続
con.method("Open", null);
//SQLの実行
IDispatch rs = (IDispatch)con.get("Execute", new Object[] {"SELECT * FROM 商品マスタ"});
//XML形式で出力
rs.method("Save", new Object[] {"C:\\excel.xml", 1});
//解放
rs.method("Close", null);
con.method("Close", null);
}
catch(Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
finally {
rm.release();
}
コメントする