この章では、オートメーション・クライアントを使用してOracleデータにアクセスする方法を説明します。
内容は次のとおりです。
Oracle Objects for OLE(OO4O)は、各種プログラミングまたはスクリプト言語を使用して、Oracleデータベースのデータにすばやく効率的にアクセスできるように設計されています。
OO4Oは、Visual Basic、Excel、Active Server Pages、Internet Information Server(IIS)およびその他開発ツールとともに簡単に使用できます。
Visual BasicでOracle Data Controlを使用すると、Oracleデータにアクセスする別のメソッドを使用できます。
この開発者ガイドには、特定のメソッドとプロパティに関する例が記載されています。さらに、サンプル・プログラムがOracle Objects for OLEとともにインストールされ、ORACLE_BASE\\ORACLE_HOME
\oo4o\
ディレクトリ内のVB、EXCEL、IIS、CPPなどの下に置かれます。
Visual BasicのOO4Oのクイック・ツアーも用意されています。
この開発者ガイドに含まれているサンプル・コード、およびOracle Objects for OLEに同梱されているサンプル・アプリケーションは、デモ・スキーマ(データベース表およびその他のオブジェクト)およびデモ用のユーザー/パスワード(scott
/tiger
)とともに使用できるように設計されています。サンプル・コードはORACLE_BASE\\ORACLE_HOME
\oo4o
ディレクトリにあります。
ORACLE_BASE\\ORACLE_HOME
\oo4o
ディレクトリにあるdemobld7.sql
スクリプトで、OO4Oデモ・スキーマを作成できます。デモ・スキーマは、demodrp7.sql
スクリプトで削除できます。
デモ・スキーマには次の参照が含まれます。
デモ表EMP
およびDEPT
ユーザーscott
とパスワードtiger
(scott
/tiger
)
ネットワーク別名ExampleDb
ネットワーク・サービス(データベース)の別名およびtnsnames.ora
ファイルの設定の詳細は、『Oracle Net Services管理者ガイド』を参照してください。
多くの例では、ネットワーク別名に"
"
(NULL文字列)を使用することによって、ローカル・データベースにアクセスできます。
ORACLE_BASE\\ORACLE_HOME
\oo4o
ディレクトリには、次の項目が含まれています。
OO4Oのサンプル・プログラム。
サブディレクトリには、C++とVisual Basicの両方のサンプルがあります。
ストアド・プロシージャの作成に使用されるoraexamp.sql
スクリプト。multicur.sql
やempcur.sql
などの追加スクリプトが、他のサンプル・プログラムを設定するために用意されています。
オプション・フラグおよびプロパティ値に使用される定数の値が含まれる、Oracle Objects for OLEのグローバル定数ファイルoraconst.txt
。これらの定数はOracleインプロセス・サーバーのタイプ・ライブラリにも含まれているため、通常、このファイルは必要ありません。
この例で示すコード部分は、ダイナセットに必要なオブジェクトをすべて作成してからダイナセット自体を作成する方法を示します。
Visual Basicを起動して新規プロジェクトを作成します。「Project」メニューから「References」を選択し、「InProcServer 5.0 Type Library」をチェックします。
Visual Basicを起動して新規プロジェクトを作成します。次に、フォームの宣言セクションに次のコードを追加します。
... ' Declare variables Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim OraDynaset As OraDynaset Dim OraFields As OraFields
Oracleデータを表示するフォームに関連付けられているLoadプロシージャに、次のコードを追加します。
' Create the OraSession Object. The argument to CreateObject is the ' name by which the OraSession object is known to the OLE system. Set OraSession = CreateObject("OracleInProcServer.XOraSession") ' Create the OraDatabase Object by opening a connection to Oracle. Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&) ' Create the OraDynaset Object. Set OraDynaset = OraDatabase.CreateDynaset("select * from emp", 0&) ' You can now display or manipulate the data in the dynaset. For example: Set OraFields = OraDynaset.fields OraDynaset.movefirst Do While Not OraDynaset.EOF MsgBox OraFields("ename").Value OraDynaset.movenext Loop End Sub
フォームを実行し、結果を表示します。
この例では、Microsoft Internet Information Server(IIS)のActive Server Pages(ASP)を使用して、Oracle Objects for OLEの接続プール機能について説明します。サンプル・コードでは、SQL SELECT
問合せを実行し、その結果をHTML表として戻します。このスクリプトで使用されているデータベース接続は、global.asa
ファイルの実行時に作成されたプールから取得されています。
Oracle Objects for OLEをOLEオートメーションとIISで使用するためには、すべてのASP拡張機能を含めて、IIS 3.0以上をインストールする必要があります。IISを実行しているコンピュータで、Oracleデータベースにアクセス可能であることも必要です。
注意: この例のサンプル・コードは、ORACLE_BASE\\ORACLE_HOME \oo4o\iis\samples\asp\connpool ディレクトリから入手できます。 |
SQL*Plusを起動し、scott
/tiger
でOracleデータベースにログインします。
次のPL/SQLプロシージャを作成します。
-- creates PL/SQL package to be used in ASP demos create or replace package ASP_demo as --cursor c1 is select * from emp; type empCur is ref cursor; PROCEDURE GetCursor(p_cursor1 in out empCur, indeptno IN NUMBER, p_errorcode OUT NUMBER); END ASP_demo; /
ASP_demoパッケージ本体を次のように作成または置換します。
PROCEDURE GetCursor(p_cursor1 in out empCur, indeptno IN NUMBER, p_errorcode OUT NUMBER) is BEGIN p_errorcode:= 0; open p_cursor1 for select * from emp where deptno = indeptno; EXCEPTION When others then p_errorcode:= SQLCODE; END GetCursor; ...
END ASP_demo; /
Active Server Pages(ASP)のサンプル・コードを作成します。OO4Oに関係のあるコードは太字になっています。
'GLOBAL.ASA <OBJECT RUNAT=Server SCOPE=Application ID=OraSession PROGID="OracleInProcServer.XOraSession"></OBJECT> <SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Application_OnStart 'Get an instance of the Connection Pooling object and 'create a pool of OraDatabase OraSession.CreateDatabasePool 1,40,200,"exampledb", "scott/tiger", 0 End Sub 'OO4ODEMO.ASP <html> <head> <title>Oracle Objects For OLE (OO4O) </title> </head> <body BGCOLOR="#FFFFFF"> <font FACE="ARIAL,HELVETICA"> <h2 align="center">Oracle Objects For OLE (OO4O) </h2> <form ACTION="OO4ODEMO.asp" METHOD="POST"> <% SqlQuery = Request.Form("sqlquery") %> <p>This sample executes a SQL SELECT query and returns the result as an HTML table. The database connection used in this script is obtained from a pool that is created when the <strong>global.asa</strong> is executed. </p> <p>SQL Select Query: <input SIZE="48" NAME="sqlquery"> </p> <p><input TYPE="SUBMIT"> <input TYPE="RESET"> <input LANGUAGE="VBScript" TYPE="button" VALUE="Show ASP Source" ONCLICK="Window.location.href = "oo4oasp.htm"" NAME="ShowSrc"></p> </form> <% If SqlQuery = "" Then %> <% Else %> <table BORDER="1"> <% Set OraDatabase = OraSession.GetDatabaseFromPool(10) Set OraDynaset = OraDatabase.CreateDynaset(SqlQuery,0) Set Columns = OraDynaset.Fields %> <tr> <td><table BORDER="1"> <tr> <% For i = 0 to Columns.Count - 1 %> <td><b><% = Columns(i).Name %></b></td> <% Next %> </tr> <% while NOT OraDynaset.EOF %> <tr> <% For col = 0 to Columns.Count - 1 %> <td><% = Columns(col) %> </td> <% Next %> </tr> <% OraDynaset.MoveNext %> <% WEnd %> </table> <p></font><%End If%> </p> <hr> </td> </tr> </table> </body> </html>
読込みと実行のアクセスが可能なMicrosoft Internet Service Managerから仮想ディレクトリを作成し、すべての.asp
および.asa
ファイルをそのディレクトリに格納します。
oo4odemo.asp
ファイルを起動するHTMLページを作成します。次のように、リンクをそのページに追加します。
<a href="/<your_path>/OO4ODEMO.ASP">This link launches the demo!</a>
Webブラウザにページをロードし、デモへのリンクをクリックします。
「SQL SELECT Query」フィールドにSELECT * FROM EMP
などの問合せを入力し、「Submit Query」ボタンを選択します。問合せの最後にセミコロン(;
)を含めないでください。
このサンプルでは、OracleデータをExcelワークシートに挿入する方法を示します。
注意: この例のサンプル・コードは、ORACLE_BASE\\ORACLE_HOME \oo4o\excel\samples\ ディレクトリから入手できます。 |
Microsoft ExcelでOLEオートメーションを使用してOracleデータをワークシートに挿入する手順は、次のとおりです。
Excelを起動して新しいワークシートを作成します。
「ツール」メニューの「マクロ」オプションを使用してOracleデータを操作するための新しいマクロを作成して編集します。
マクロ用のVisual Basicコードを入力し、Oracleダイナセットを作成してアクセスします。たとえば、次のEmpData()
およびClearData()
プロシージャ(マクロ)を参照してください。
Sub EmpData() 'Declare variables Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim EmpDynaset As OraDynaset Dim flds() As OraField Dim fldcount As Integer Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase("ExampleDB", "scott/tiger", 0&) Set EmpDynaset = OraDatabase.CreateDynaset("select * from emp", 0&) Range("A1:H15").Select Selection.ClearContents 'Declare and create an object for each column. 'This will reduce objects references and speed up your application. fldcount = EmpDynaset.Fields.Count ReDim flds(0 To fldcount - 1) For Colnum = 0 To fldcount - 1 Set flds(Colnum) = EmpDynaset.Fields(Colnum) Next 'Insert Column Headings For Colnum = 0 To EmpDynaset.Fields.Count - 1 ActiveSheet.Cells(1, Colnum + 1) = flds(Colnum).Name Next 'Display Data For Rownum = 2 To EmpDynaset.RecordCount + 1 For Colnum = 0 To fldcount - 1 ActiveSheet.Cells(Rownum, Colnum + 1) = flds(Colnum).Value Next EmpDynaset.MoveNext Next Range("A1:A1").Select End Sub Sub ClearData() Range("A1:H15").Select Selection.ClearContents Range("A1:A1").Select End Sub
簡単にアクセスできるように、EmpData()
やClearData()
などの作成されたプロシージャ(マクロ)をワークシート上のコマンド・ボタンに割り当てます。このボタンを選択すると、ワークシートのデータを消去してリフレッシュできます。次のスクリーンショットでは、ClearData()
が「Clear」ボタンに、EmpData()
が「Refresh」ボタンに割り当てられています。
Visual C++でのOracle Objects for OLEの詳細は、オンライン・ヘルプとして利用できるOracle Objects for OLE C++クラス・ライブラリ開発者ガイドを参照してください。
Oracle Data Controlがリフレッシュされると、クライアント(必要な場合)、セッション、データベースおよびダイナセットが自動的に作成されます。基本的なアプリケーションの場合、コードは不要かほとんど必要ありません。
この項では、Oracle Data Controlのプロパティを設定する方法を2つ示します。
Visual Basicの「Properties」ウィンドウを使用する方法
プロパティをプログラミングする方法
Visual Basicを起動して新規プロジェクトを作成します。
「Project」メニューの「Components」オプションで、プロジェクトに「Oracle Data Control」を追加します。
Visual Basicのツール・パレットにOracle Data Controlが追加され、次のように表示されます。
Oracle Data Controlをプロジェクトに追加するために、そのコントロールをフォーム上にドラッグ・アンド・ドロップします。コントロールのサイズと位置を調整してください。
コントロールの名前をOraDataControl
に変更します。Oracleデータベースにアクセスするために、Connect
、DatabaseName
およびRecordSource
プロパティを次のように設定します。
Oracle Data Controlが設定されると、Visual Basicコントロールを同じフォームにドラッグ・アンド・ドロップして、コントロール内のデータにアクセスできます。希望するデータ・フィールドとデータ・ソースにアクセスするには、「Data」にあるプロパティを設定します。次の図は、従業員番号の表示を設定するTextBoxコントロールを示します。
プロジェクトが実行されると、Oracle Data Controlを使用して、RecordSource
プロパティによって識別されたデータが表示されます。
Microsoft Grid Controlを使用して、表内の全データを表示することもできます。「Project」メニューの「Components」オプションで、グリッド・コントロールを追加する必要があります。
次に示すコード部分では、ダイナセットの作成に必要なOracle Data Controlのプロパティをプログラムで設定する方法を示します。これらは、Visual Basicの「Properties」ウィンドウで設定できるプロパティと同じです。
新しいプロジェクトを作成し、「Project」メニューの「Components」オプションでプロジェクトに「Oracle Data Control」を追加します。
Oracle Data Controlをフォーム上にドラッグ・アンド・ドロップします。コントロールの名前をOraDataControl
に変更します。
フォームにOracle Data Controlを挿入した後、フォームに関連付けられているLoadプロシージャに次のコードを追加します。
... 'Set the username and password. OraDataControl.Connect = "scott/tiger" 'Set the database name. OraDataControl.DatabaseName = "ExampleDb" 'Set the record source. OraDataControl.RecordSource = "select * from emp" 'Refresh the data control. OraDataControl.Refresh ...
これで、次のように、参照できる有効なセッション、データベースおよびダイナセットが作成されました。
オブジェクト | 参照 |
---|---|
orasession |
oradatacontrol.oradatabase.orasession |
oradatabase |
oradatacontrol.oradatabase |
oradynaset | oradatacontrol.recordset |
前の例に示したように、TextBoxなどのVisual Basicコントロールを使用して、RecordSource
プロパティのデータにアクセスできます。
この例では、Oracle Data Controlを伴った簡単なWin32アプリケーションをMS Visual C++を使用して作成する方法を示します。この例では、Oracleデータ・コントロールとDBグリッド・コントロールの両方がシステムに登録されていると仮定しています。
Microsoft Visual C++プログラムを起動します。
「File」メニューから「New」を選択します。
「New Window」の「Projects」タブで、「MFC AppWizard.exe」を選択します。OO4Oなどのプロジェクト名を入力し、プロジェクトの位置を決定します。「OK」をクリックします。
「MFC AppWizard」のステップ1で、「Dialog based application」を選択してから「Next」をクリックします。
ウィザードのステップ2で、「ActiveX Controls」ボックスがチェックされていることを確認してデフォルトを受け入れ、ダイアログ・ボックスのタイトルを入力します。「Next」をクリックします。
ウィザードのステップ3で、デフォルトを受け入れます。「Next」をクリックします。
ステップ4で、「Finish」をクリックします。「New Project Information」画面で「OK」をクリックします。
「Project Workspace」ダイアログ・ボックスで、「ResourceView」タブを選択します。「Resources」フォルダを拡張してから「Dialog」フォルダを拡張します。
ダイアログ・ボックスを編集できるように、メイン・プロジェクトのダイアログ・ボックスをダブルクリックします。
注意: OO4Oをプロジェクト名として使用していた場合は、IDD_OO4O_DIALOG
となります。
ダイアログ・ボックスにあるデフォルトのコントロールを削除します。サイズを調整してダイアログ・ボックスを拡大します。
選択したダイアログ・ボックスで、マウスの右ボタンをクリックしてメニューを表示します。メニューから「Properties」を選択します。「Properties」ウィンドウの「General」タブで、キャプションを「Oracle Data Control Example」に変更します。「Properties」ウィンドウをクローズします。
選択したダイアログ・ボックスで、マウスの右ボタンをクリックしてメニューを表示します。メニューから「Insert ActiveX Control...」を選択します。このウィンドウで「ORADC Control」を選択し、「OK」をクリックします。
ダイアログ・ボックスの下部に「ORADC Control」を配置します。選択したデータ・コントロールで、マウスの右ボタンをクリックしてメニューを表示します。メニューから「Properties」を選択します。
「Properties」ウィンドウの「General」タブで、ID
をIDC_ ORADATACONTROL
に変更します。アプリケーションの実行時にコントロールが非表示になるように、「Visible」のチェック・マークを解除します。
「Properties」ウィンドウの「All」タブを表示し、次のプロパティを設定します。
Connect: scott/tiger DatabaseName: exampledb RecordSource: select * from emp
選択したダイアログ・ボックスで、マウスの右ボタンをクリックしてメニューを表示します。メニューから「Insert ActiveX」コントロールを選択します。「DBGrid Control」を配置して「OK」をクリックします。
「DBGrid Control」をダイアログ・ボックスの上部に配置してサイズを調整します。コントロールに対するプロパティを表示します。「Properties」ウィンドウの「All」タブで、DataSource
プロパティにOracle Data Control(IDC_ORADATACONTROL
)を設定します。その他のプロパティに関しては、デフォルトを受け入れます。これらのデフォルトは後で変更できます。
「File」メニューから「Save All」を選択します。
プロジェクトをビルドして実行します。
次の図のように、emp
表からのレコードがDBGrid Controlに表示されます。