初音 玲 HATSUNE, Akira
Oracleを使うWindowsアプリケーションにCOM対応の言語を使える開発者は,幸せだ.それは,Oracle Objects for OLEという安定したミドルウェアが使えるからだ.
そのOracle Objects for OLEもバージョンアップを重ね,現在では,V2.3にまで成長してきた.今回は,バージョンごとの機能差を紹介すると共に,最新版の新機能の使い方を探ってみたいと思う.
| Oracle Objects for OLEの基礎知識 |
|---|

| Oracle Objects for OLE歴史探求 |
|---|
| Oracle Objects for OLE 2.3の新機能 |
|---|

Set objSQL= objDb.CreateSql( _ strSQL,ORASQL_FAILEXECのようにOraSQLStmtオブジェクトを定義(図3(1))して,同じOraDatabaseオブジェクトにOraParameterオブジェクトを生成させる(図3(2)).そして,そのOraParameterオブジェクトにカーソル変数を指定して,
Set objDs = _
objDb.Parameters("curOrder").value
のようにOraDynasetオブジェクトを生成する(図3(3)).
| Oracle Objects for OLEの基礎知識 |
|---|
ping ora8.vbmag.shoeisha.co.jpと入力して,Replyが返ってくれば,TCP/IPレベルの確認は完了だ.もし,Replyが返ってこなければ,クライアント,サーバ双方のネットワーク定義やLANなどの通信周りを確認する.
tnsping vbmagまたは
tnsping8 vbmagと入力して正しい応答があるか確認する.
Const mcOLE = "OracleInProcServer.XOraSession"
Private Sub cmdOK_Click()
Dim strConnect As String
Dim strHost As String
strConnect = Trim$(txtUser.Text)
If Len(Trim$(txtPass.Text)) > 0 Then
strConnect = strConnect & "/" & Trim$(txtPass.Text)
End If
strHost = Trim$(txtHost.Text)
Set pobjSess = CreateObject(mcOLE)
Set pobjDb = _
pobjSess.DbCreateDatabase(strHost, strConnect, 3&)
End Sub
|
Private Sub cmdSearch_Click()
Dim strSQL As String
Dim objDs As Object
Dim strErrText As String
On Error GoTo errClick:
strSQL = "SELECT * FROM emp"
Set objDs = pobjDb.DbCreateDynaset(strSQL, 8&) …(1)
lstResult.Clear
Do While Not objDs.EOF …(2)
lstResult.AddItem objDs("empno").Value …(3)
objDs.DbMoveNext …(4)
Loop
exitClick:
On Error Resume Next
Set objDs = Nothing …(5)
Exit Sub
errClick:
If pobjSess.LastServerErr = 0 Then
If pobjDb.LastServerErr = 0 Then
strErrText = Error$
Else
strErrText = pobjDb.LastServerErrText
pobjDb.LastServerErrReset
End If
Else
strErrText = pobjSess.LastServerErrText
pobjSess.LastServerErrReset
End If
MsgBox strErrText, vbOKOnly + vbExclamation, App.Title
Resume exitClick:
End Sub
|
| (1) | ログオンが成功したpobjDb変数に対してCreateDynasetメソッドを実行する.このメソッドの第一パラメタはSELECT文,第二パラメタはオプションになる. |
| (2) | CreateDynasetメソッドが成功すると,objDs変数ととカーソル情報(Oracle Objects for OLEの世界では,OraDynasetオブジェクトという)が関連付けられます.よって,検索した結果をすべて取得するときには,EofになるまでobjDs変数が参照している情報を取得する.もし,1レコードも検索できなかった場合は,CreateDynasetメソッド実行直後で既にEofがTrueになる. |
| (3) | objDs変数が示すレコードの情報を取得する. |
| (4) | OraDynasetオブジェクトのMoveNextメソッドを使って次のレコードを取得する.Eofまでのループのなかで,MoveNextメソッドを忘れると無限ループに陥るので注意. |
| (5) | 使いおわったOraDynasetオブジェクトは,Nothingを使い明示的にCloseする. |
Private Sub cmdUpdate_Click:
On Error Goto errClick:
strSQL = "SELECT * FROM emp"
Set objDs = pobjDb.DbCreateDynaset(strSQL, 0&)
If objDs.Eof Then
objDs.DbAddNew …(1)
Else
objDs.DbEdit …(2)
End If
objDs("ename").Value = "TestUsers" & objDs("ename").Value …(3)
objDs.Update …(4)
exitClick:
On Error Resume Next
Exit Sub
errClick:
If pobjSess.LastServerErr = 0 Then
If pobjDb.LastServerErr = 0 Then
strErrText = Error$
Else
strErrText = pobjDb.LastServerErrText
pobjDb.LastServerErrReset
End If
Else
strErrText = pobjSess.LastServerErrText
pobjSess.LastServerErrReset
End If
MsgBox strErrText, vbOKOnly + vbExclamation, App.Title
Resume exitClick:
End Sub
|
| (1) | DbAddNewメソッドにより挿入モード |
| (2) | DbEditメソッドにより更新モード |
| (3) | 列に値を設定(実際は,クライアント側のバッファに格納). |
| (4) | Updateメソッドを実行して,クライアント側のバッファからデータベースのレコードに値を反映 |
| Oracleのデータ型 | Visual Basicのデータ型 |
| CHAR | String |
| DATE | Variant |
| LONG | String |
| LONG RAW | String |
| NUMBER (1-4,0) | Integer |
| NUMBER (5-9,0) | Long |
| NUMBER (10-15,0) | Double |
| NUMBER (16-38,0) | String |
| NUMBER (1-15,n) | Double |
| NUMBER (16-38,n) | String |
| RAW | String |
| VARCHAR2 | String |
SELECT * FROM emp WHERE empno= :empのようにバインド変数を指定して,同一のSQL文を仕立て上げる.
pobjDb.Parameters.Add "strEname", "0", 1 …(1)
strSQL = "UPDATE emp SET ename = ename || strEname"
For iintLoop = 1 To 1000
pobjDb.Parameters("intID") = iintLoop
lngRet = pobjDb.DbExecuteSQl(strSQL)
Next
exitClick:
On Error Resume Next
pobjDb.Parameters.Remove "strEname" …(2)
Exit Sub
errClick:
<エラー処理>
Resume exitClick:
|
| (1) | バインド変数を定義 |
| (2) | バインド変数を削除 |
poraDb.Parameters.Add "intCnt", 0, 2
poraDb.Parameters.AddTable "astrItem", 2, 1, 1000, 20 …(1)
Set objSpread = poraDb.Parameters("astrItem") …(2)
strSQL = "BEGIN pkgTEST.subTEST1(:astrItem,:intCnt); END;" …(3)
poraDb.DbExecuteSQL (strSQL) …(4)
grdResult.Rows = poraDb.Parameters("intCnt").Value \ 8 …(5)
grdResult.Row = 0
For ilngRow = 1 To grdResult.Rows - 1
grdResult.Row = grdResult.Row + 1
For ilngCol = 0 To grdResult.Cols - 1
grdResult.Col = ilngCol
lngPos = ilngCol + (ilngRow - 1) * 8 + 1 …(6)
grdResult.Text = poraDb.Parameters("astrItem").get_Value(lngPos) …(7)
Next
Next
exitClick:
On Error Resume Next
poraDb.Parameters.Remove "intCnt"
poraDb.Parameters.Remove "astrItem" …(8)
Set objSpread = Nothing …(9)
Exit Sub
|
| (1) | AddTableメソッドにより,バインド配列「astrItem」をVARCHAR2型の出力パラメタとして定義 |
| (2) | バインド配列をオブジェクト変数に設定 |
| (3) | ストアドパッケージを実行するSQL文を設定 |
| (4) | SQL文を実行 |
| (5) | バインド配列の大きさを取得 |
| (6) | バインド配列の要素を取り出す位置を計算 |
| (7) | バインド配列の値を取得 |
| (8) | 使いおわったバインド配列はRemoveメソッドで破棄 |
| (9) | 使いおわったバインド配列用オブジェクト変数はNothingで破棄 |
OIP23.DLL ORAIPSRV.REG (ORAIP_ST.REG) OIP23.TLB ORAANSI.DLLだ.Oracle Objects for OLEを使っているときは,これらをアプリケーションの一部として配布して,<ORAHOME>\BINディレクトリにインストールする必要がある.また,ORAIPSRV.REGにある情報をレジストリに登録する.
regedit.exe oraipsrv.regさらに,データコントロールを使用するアプリケーションは,次のファイルの配布が必要だ.
ORADC.OCXデータコントロールを使用する場合は,ファイルをアプリケーションに含めるだけでなく,
regsvr32.exe oradc.ocxとして,同様にWindowsのレジストリに登録する.
| 最後に |
|---|