【IRIS/Cache】【SQL】ODBC接続を行いデータを取得する

はじめに

Interoperabilityを利用していれば、わざわざODBC接続用のロジックを組む必要はありません。

ただ、毎回Interoperabilityを利用できるとは限らないので、利用できない時の対応方法を知っておく必要があります。

ODBC接続で使用するロジックは、中々出番がないため忘れがちですよね。

今回は、ODBCで他サーバのIRISと接続するサンプルを作ってみました。

接続用のコネクションを作成する

ODBC接続する時は、「%Library.SQLGatewayConnection.cls」を使用します。
あちこち使いまわす事を考慮して、小さな関数にまとめました。

ClassMethod GetConnection(ByRef con As %SQLGatewayConnection, DSN As %String, USER As %String, PWD As %String, Timeout As %Integer = 90) As %Status
{
	s sts = $$$OK
	
	try {
		s con = ##class(%SQLGatewayConnection).%New()
		$$$ThrowOnError( con.Connect(DSN, USER, PWD, Timeout) )		
	} catch e {
		s sts = e.AsStatus()
	}
	
	q sts
}

引数は、コネクションを受け取る「con」と、接続用の各種パラメータ「DSN(データソース名)」「USER(ユーザ名)」「PWD(パスワード)」、接続時のタイムアウト値「Timeout」になります。

使い方は、後ほどサンプルとあわせて説明します。

DSNを作成する

windowsの検索から「odbc」と入力して下さい。
「ODBCデータ ソース(64 ビット)」若しくは「ODBCデータ ソース(32 ビット)」が検索されます。

「64ビット」と「32ビット」どちらを利用するかは、環境にあわせて選択して下さい。
今回は、64ビットの方を使用します。
「ODBC データ ソース(64 ビット)」をクリックして下さい。

クリックすると、「ODBC データ ソース アドミニストレーター(64 ビット)」画面が起動するので、「システムDSN」タブをクリックして下さい。

「IRIS User」の64ビットが表示されていれば問題ありません。
クリックして「InterSystems ODBC データ ソースセットアップ」画面を起動させます。

下記を入力していきます。

  • 名前 → 引数「DSN」に該当します
  • ホストIP
  • ポート(スーパーサーバーポート番号)
  • 接続先のネームスペース
  • ユーザ名 → 接続先のIRIS:ユーザ名
  • パスワード → 接続先のIRIS:パスワード

入力が終わったら、念のため「テスト接続」を行って、入力に間違いがないか確認してみます。

接続テストが正常に終了したら、入力内容に問題はありません。
DSNの設定は完了になります。

もし、「IRIS User」が無い場合は、インストール時の下記を確認してみて下さい。

コネクションとDNSを利用して、SQLを実行する

では、先ほど作成した「コネクション」「DSN」を利用して、簡単ですがSQLでデータを取得する処理を作成します。

ClassMethod get()
{
	try {
		s DSN  = "Sample"
		s USER = *******
		s PWD  = *******
		$$$ThrowOnError( ..GetConnection(.con, DSN, USER, PWD))
		
		s query = "select top 10 ID,startDate from developer_data.ODBCData"
		s rs = ##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
		$$$ThrowOnError( rs.Prepare(query, ,con) )
		$$$ThrowOnError( rs.Execute() )
		
		while ( rs.%Next( .sts ) ) {
			q:$$$ISERR(sts)		
			w !,rs.%Get("ID"),",",rs.%Get("startDate")
		}
		$$$ThrowOnError( con.Disconnect() )
	}catch e {
		w !,$system.Status.DisplayError(e.AsStatus())
	}
}

では作成した関数をターミナルで実行してみましょう。

d ##class(developer.ODBC).get()

ちゃんと結果が得られました。
後は接続先のデータと比較するだけですね。

接続先の管理ポータルから、同じクエリを実行して比較してみましょう。

味気ないデータですが、相違はない様です。
ODBC接続を利用して、他のIRISからデータが正常に取得できましたね!

おわりに

いかがだったでしょうか。

割と簡単な設定とロジックと設定で、他サーバのデータを取得することが出来ました。
今回のサンプルはIRISでしたが、ODBCもJDBCも大して変わらず接続する事が可能です。

いざ接続となった時に参考になれば幸いです!

IRISのODBCデータソースとCacheのODBCデータソースは別物のため、IRISからCacheへのODBC接続は、IRISのデータソースを使用しての接続が行えません。

IRISからCacheへ接続したい場合は、Cacheのデータソースを別途入手し、インストールしてから利用して下さい。