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

| コメント(0) | トラックバック(0)


長いタイトルですが

やりたいこととしては、サーバーサイドで表題の処理をおこない、

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();
  }

 

トラックバック(0)

トラックバックURL: http://pg2se.com/mt6/mt-tb.cgi/22

コメントする