TAGS
dotnet, All
 
開発者:.Net

すべての型を取得
Christian Shay著

Oracle Developer Tools for Visual StudioおよびOracleユーザー定義型を使用したアプリケーションの構築

高性能なADO.NETに準拠したデータ・プロバイダである、Oracle Data Provider for .NET(ODP.NET)を使用すると、開発者は、パフォーマンス・チューニングおよびセキュリティ機能が組み込まれたOracle Databaseのエンタープライズ機能のすべてを活用できます。ODP.NETは、Microsoft Visual StudioのアドインであるOracle Developer Tools for Visual Studioと組み合わせて使用することができ、.NET開発者が共通のデータベース・タスクを容易に利用できるようになります。 たとえば、表の作成、PL/SQLの編集とデバッグ、SQLスクリプトの編集と実行、データベース・スキーマ・オブジェクトにアクセスする.NETコードの自動生成、およびそのほか多くのデータベース・タスクをVisual Studioからおこなうことができます。

ユーザー定義型(UDT)を使用すると、顧客や購買注文などの実社会のエンティティを、Oracle Database内のオブジェクトとしてモデリングできます。また、ODP.NET 11gにはUDTのサポートが追加されているので、開発者はそれぞれのオブジェクト、VARRAY、およびネストした表のタイプに、C#コードまたはVB.NETコードでアクセスできます。 Oracle Developer Tools for Visual StudioもUDTをサポートしているため、Visual Studioを使用してUDTを作成および変更し、.NETコードを自動生成してそれらのUDTにアクセスできます(UDTをそれぞれのPL/SQLインタフェースの一部として受け入れるOracle SpatialおよびOracle Advanced Queuingを活用している.NET開発者には、UDTはとくに利益をもたらすものになります。 VARRAYとネストした表のタイプは、PL/SQLのビジネス・ロジックで頻繁に使用されています)。

この記事では、ODP.NETとOracle Developer Tools for Visual Studioの両方を使用し、Visual Studioを使用してOracle DatabaseにUDTを作成するプロセスを段階的に説明します。次に、サンプルのASP.NET Webアプリケーションを作成して、これらのオブジェクトの値を表示します。

この記事の手順を実行するには、Visual Studio 2008またはVisual Studio 2005が必要であり、Oracle Database(Oracle9i Database以降)のインスタンスにアクセスできる必要があります。 また、この記事のサンプル・アプリケーションは、Visual Studio .NET 2003からも実行できますが、この場合の手順は、この記事で使用されている手順とは大幅に異なります。

Oracle Developer Tools for Visual StudioおよびODP.NETバージョン11.1以降の両方をダウンロードしてインストールする必要があります。 これらの製品は無償であり、この記事の最後にある" 次のステップ"のリンクを使用して、Oracle Technology Networkからダウンロードできます。 Oracle Databaseのオブジェクト関連機能に精通されていない方は、" 次のステップ"にあるURLから『 Oracle Database オブジェクト・リレーショナル開発者ガイド 』にアクセスしてください。このガイドに、この記事で使用している概念と用語が説明されています。

データとアプリケーションの設計

Oracle Databaseのオブジェクト関連の機能の一部を実際に試す際には、データベースのデザインをシンプルなものにします。 そのためには、まず単純な顧客オブジェクト・タイプ、CUSTOMER_OBJを作成します。これは、顧客番号、顧客名、アドレス・オブジェクトのADDRESS_OBJ、および電話番号リストのPHONELIST_OBJ(これは最大10件の電話番号を含むVARRAYです)で構成されます。 CUSTOMER_OBJオブジェクトは、CUSTOMER_TABオブジェクト表に格納されます(オブジェクト表にオブジェクトを格納すると、オブジェクトは 参照可能 になります。つまり、ポインタ、REFを使用して、ほかの表の列でオブジェクトを参照できるようになります。SQL文およびアプリケーション・コード内の任意のREFを"間接参照"することもできます)。 最後に、CUSTOMER_MEETINGSリレーショナル表を作成します。この表は、ミーティングID、ミーティングの日付、場所、およびCUSTOMER_OBJオブジェクトのREFで構成されます。

ASP.NET Webアプリケーションのデザインもシンプルにします。 すべての顧客とのミーティングを、それぞれの顧客のすべての詳細情報とともにWebページに表示します。 Winform(シック・クライアント)アプリケーションも容易に作成できます。その作成手順は、ここでおこなう、このASP.NET Webアプリケーションの手順とよく似ています。

ユーザー定義型の作成

Oracle DatabaseのVisual Studioとのおもな統合ポイントは、サーバー・エクスプローラです(図1を参照)。これは、Oracle Databaseスキーマを表示することができるツリー・コントロールです。 サーバー・エクスプローラ内の各スキーマ・オブジェクトには、さまざまなウィザードとデザイナを起動するコンテキスト・メニュー項目があります。

 

Visual Studio、ODP.NET、およびOracle Developer Tools for Visual Studioがインストールされていて、Oracle Databaseスキーマが利用可能であれば、アプリケーションを作成する準備はできています。 まずは、Oracle Databaseに接続します。 Visual Studioで、サーバー・エクスプローラの データ接続 ノードを右クリックして、「 接続の追加 」を選択します。 Oracle Data Provider for .NET が選択されていることを確認して、接続ダイアログ・ボックスに必要なデータベース情報を入力し、「 OK 」をクリックして接続します。

次に、CUSTOMER_OBJオブジェクトのさまざまな子コンポーネントを作成します。最初に、アドレス・オブジェクト型を作成します。 サーバー・エクスプローラで、「 ユーザー定義タイプ 」ノードまでスクロールして右クリックします。次に、「 新規オブジェクト・タイプ 」を選択します。 これで、図2に表示されているような、オブジェクト・デザイナが起動します。「 タイプ名 」にADDRESS_OBJと入力します。 「 追加 」を4回クリックして、属性を4つ作成します。 デザイナの左側(属性の下)で各属性を選択して、右側(属性のプロパティの下)でその 名前 タイプ を以下の値に変更します。

 

 

図1
図1:サーバー・エクスプローラとコンテキスト・メニュー
図2
図2:オブジェクト・デザイナ
名前 タイプ (データ型)
STREET VARCHAR2(200)
CITY VARCHAR2(200)
STATE CHAR(2)
ZIP VARCHAR2(20)



実行されるSQLは、「 プレビューSQL >>」をクリックして確認できます。 「 OK 」をクリックして、型を作成します。

ここで、電話番号のVARRAYであるPHONELIST_OBJを作成します。 もう一度、「 ユーザー定義タイプ 」ノードを右クリックし、今回は「 新規可変長配列タイプ 」を選択します(図1を参照)。 これで、VARRAYデザイナが起動します。 タイプ名 フィールドに PHONELIST_OBJ 制限 フィールドに 10 タイプ フィールドに Varchar2 サイズ フィールドに 20 と入力します。 次に、「 OK 」をクリックしてオブジェクト型を作成します。

最後に定義する型は、CUSTOMER_OBJです。 もう一度、「 ユーザー定義タイプ 」ノードを右クリックして、「 新規オブジェクト・タイプ 」を選択します。

タイプ名 に、CUSTOMER_OBJと入力します 。 ADDRESS_OBJを作成したときにおこなったように、まず「 追加 」を4回クリックして、属性を4つ作成します。 次に、デザイナの左側(属性の下)で各属性を選択して、右側(属性のプロパティの下)でその 名前 タイプ を以下の値に変更します。

 

名前 タイプ (データ型)
CUSTNO NUMBER
CUSTNAME VARCHAR2(200)
ADDRESS ADDRESS_OBJ
PHONELIST PHONELIST_OBJ



最後の2つの属性は、作成したばかりのユーザー定義型です。 ユーザー定義型は、属性のプロパティ タイプ リストの最後に、Oracle標準の全データ型の後ろに表示されます。

ここで、CUSTOMER_OBJオブジェクトを格納するオブジェクト表を作成する必要があります。この表を作成することで、REFを使用して、ほかの表でそれらのオブジェクトを参照できるようになります。 サーバー・エクスプローラで、「 」ノードを右クリックして、「 新規オブジェクト表 」を選択します。 ダイアログ・ボックスが開いたら、 表名 CUSTOMER_TAB と入力し、 オブジェクト・タイプ リスト(図3を参照)から「 CUSTOMER_OBJ 」を選択します。 「 保存 」をクリックして表を作成します。

 

データベース・スキーマ・オブジェクトの構築を終了するには、 CUSTOMER_MEETINGS 表を作成する必要があります。 サーバー・エクスプローラで、「 」ノードを右クリックして、「 新規リレーショナル表 」を選択します。 表名 CUSTOMER_MEETINGS と入力します。 「 追加 」を4回クリックして、列を4つ作成します。 次に、デザイナの左側(列の下)で各列を選択して、右側(列プロパティの下)でその 名前 データ型 を以下の値に変更します。

 

図3
図3:オブジェクト表デザイナ
名前 データ型
MEETING_ID NUMBER
TIME DATE
LOCATION VARCHAR2(20)
CUSTOMER CUSTOMER_OBJ



これまでと同様、 CUSTOMER 列のデータ型を選択するときには、 データ型 リストの下部で CUSTOMER_OBJ ユーザー定義型を探す必要があります。 「 REFとして作成 」チェック・ボックス(図4を参照)をチェックし、「 保存 」をクリックして表を作成します。

 

オブジェクトへのデータの移入

Oracle Databaseに、スキーマ・オブジェクトを作成したら、それらにデータをロードする必要があります。 データをロードするには、OracleがVisual Studioに統合した非定型の問合せウィンドウを使用してSQL文を実行します。 サーバー・エクスプローラで、「 」ノードを右クリックして、「 問合せウィンドウ 」を選択します。 リスト1のSQLを入力し、すべての文を選択して、緑色の「 問合せの実行」ツールバー・アイコンをクリックしてすべての文を実行します。

コード・リスト1: データのロード

 

INSERT INTO Customer_tab
  VALUES (
    1, 'John Doe',
    Address_obj('111 Lollipop Lane', 'Redwood Shores', 'CA', '95054'), 
    PhoneList_obj('415-555-1212')
    ) ;

INSERT INTO Customer_tab
  VALUES (
    2, 'John Smith',
    Address_obj('333 Island Drive', 'Edison', 'NJ', '08820'),
    PhoneList_obj('609-555-1212','201-555-1212')
    ) ;

INSERT INTO Customer_tab
  VALUES (
    3, 'Richard Roe',
    Address_obj('555 Clay St', 'San Francisco', 'CA', '94115'),
    PhoneList_obj('415-555-1212','650-555-1212', '510-555-1212')
    ) ;

INSERT INTO Customer_meetings
  SELECT  '1', TO_DATE('12-01-2008','DD-MM-YYYY'), 'HQ - 200', REF(C)
   FROM   Customer_tab C
   WHERE  C.CustNo = 1 ;

INSERT INTO Customer_meetings
  SELECT  '2', TO_DATE('13-01-2008','DD-MM-YYYY'), 'HQ - 300', REF(C)
   FROM   Customer_tab C
   WHERE  C.CustNo = 2 ;

ASP.NET Webアプリケーションの作成

データベースの準備ができたら、Visual Studioの.NETコードの自動生成機能を利用して、ASP.NET Webアプリケーションを作成します。 メイン・メニューで、「 ファイル 」→「 新規作成 」→「 プロジェクト 」を選択して、 Visual C#, Web プロジェクト・タイプから「 ASP.NET Web アプリケーション 」を選択します。 (カスタム・クラス・ウィザードではこのプロジェクト・タイプはサポートされていないので、「 ファイル 」→「 新規作成 」→「 Webサイト 」は選択しないでください。) 「 表示 」→「 ツールボックス 」を選択して、ツールボックスのデータセクションで、「 GridView 」コントロールをドラッグして、ASP.NETデザイン・サーフェイスにドロップします。 GridViewコントロールの右上隅にある小さな矢印を右クリックして、GridView タスクペインを開きます(図5を参照)。 データ ソースの選択 リストから、「 <新しいデータ ソース> 」を選択します。 これで、データソース構成ウィザードが起動します。このウィザードで、自動的に生成されたODP.NETデータ・アクセス・コードを含む、SQLDataSourceコンポーネントを作成して、設定します。 ウィザードが開いているときに、データベース・アイコンをダブルクリックします。 正しい接続を選択して、"Selectステートメントの構成"画面に進みます。 「 カスタム SQLステートメントまたはストアドプロシージャを指定する 」ラジオ・ボタンをクリックして、「 次へ 」をクリックします。次に、テキスト・ボックスに以下のSQL文を入力します。

 

 

SELECT MEETING_ID, TIME, LOCATION, DEREF(CUSTOMER) 
FROM CUSTOMER_MEETINGS

 

図4
図4:リレーショナル表デザイナ
図5
図5:GridViewコントロールの設定
次のステップ


ダウンロード
ODP.NETおよびOracle Developer Tools for Visual Studio .NET 11g

Shay 氏のそのほかの記事

オブジェクト関連機能の詳細については、『 Oracle Databaseオブジェクト・リレーショナル開発者ガイド 』を参照してください。

SQLには、SQL DEREF演算子が含まれている点に注意してください。 これにより、REFではなく、オブジェクト値が戻されるようになります。REFは、ROWIDと同様、16進数の大きな値にすぎません(REFを問い合わせるアプリケーションを作成し、そのREFを使用して、各オブジェクトの値を個々にフェッチすることもできます。しかし、このアプローチについては、この記事では取り上げていません)。

次へ 」に続いて「 クエリのテスト 」をクリックし、エラーがないことを確認します。 次に、「 完了 」をクリックします。 GridView タスクペインにもう一度移動して、「 新しい列の追加 」をクリックします。 ヘッダー テキスト Customers と入力し、 データ フィールド に「 DEREF(CUSTOMER) 」を選択します。

カスタム・クラス・ウィザードの使用

この段階では、GridViewコントロールとSQLDataSourceコントロールは、Oracle Databaseによって戻されているCUSTOMER_OBJ型をどのように扱えばいいかわかりません。 定義上、これらのコントロールはユーザー定義となっているので、ユーザーは、Oracleユーザー定義のデータ型とデータを保持する.NETクラス間のマッピングを指定する必要があります。 マッピングを指定するには、Oracleカスタム・クラス・ウィザードを使用します。

サーバー・エクスプローラで、作成した3つの各ユーザー定義型(CUSTOMER_OBJ、PHONELIST_OBJ、およびADDRESS_OBJ)に移動して、以下の手順を実行します。 型の名前を右クリックして、「 カスタム・クラスの生成 」を選択します。 次に、すべてデフォルト値を受け入れて、ウィザードの最後まで進みます。これで、C#クラス・ファイルがプロジェクトに追加されます。 図6は、生成されたカスタム・クラス(Customer_obj.cs)から、CUSTOMER_OBJ Oracle Database UDTへのマップを示しています。

 

SQLDataSourceコントロールは、CUSTOMER_OBJオブジェクトに、ToString()メソッドを呼び出して、その値を文字列としてレンダリングするように要求します。そのため、CUSTOMER_OBJカスタム・クラスとPHONELIST_OBJカスタム・クラスの両方でToString()メソッドを変更する必要があります(この例では、ADDRESS_OBJのToString()メソッドは無視できます。これは、このメソッドの個々のメンバーが、CUSTOMER_OBJのToString()メソッド内のコードによって明示的にレンダリングされるためです)。 このサンプル・アプリケーションでは、リスト2のコードをToString()メソッドに使用します。

コード・リスト2: カスタム・クラスのToString()メソッド

 

CUSTOMER_OBJクラスのToString()メソッド(Customer_obj.cs内):
public override string ToString() {
return "Customer Number: " + CUSTNO + "<br>Name: " + CUSTNAME +     "<br>Address: " + 
ADDRESS.STREET + " " + ADDRESS.CITY + " " + ADDRESS.STATE+ " " + ADDRESS.ZIP + 
"<br>Phone Numbers:<br>" + PHONELIST.ToString(); }

PHONELIST_OBJクラスのToString()メソッド(Phonelist_obj.cs内):
public override string ToString()
        {
            string ret = "";
            for (int x = 0; x < m_PHONELIST_OBJ.Length; x++)
            {
                ret = ret + m_PHONELIST_OBJ[x] + "<br>";
            }
            return ret;
        }

最後に、CUSTOMER_OBJカスタム・クラスのToString()メソッドが返すHTMLタグが、GridViewコントロールで受け取られることを確認する必要があります。 GridView タスクに戻って、「 列の編集 」を選択します。 表示されるダイアログ・ボックスの 選択されたフィールド で、「 CUSTOMERS 」を選択します。 右側にあるプロパティペインで、 HTML Encode False に設定して、「 OK 」をクリックします。

ASP.NET Webアプリケーションの実行

メイン・メニューから、「 デバッグ 」→「 デバッグなしで開始 」を選択します。 これで、Microsoft Internet Information Server Webサーバー(Visual Studioに組込み済み)が起動し、このWebサーバーを指すURLを使用してWebブラウザも起動します。 結果は、図7に示してあります。Webブラウザには、MEETING_ID、TIME, LOCATION、およびCUSTOMERS列のデータを含んでいるグリッドが表示されます。

 

まとめ

ここでは、Visual Studioを使用して、Oracle Database内のユーザー定義型、オブジェクト表、およびCustomerオブジェクトへのREFを含むリレーショナル表を作成しました。 また、オブジェクトにデータを移入して、オブジェクトの.NETカスタム・クラスを生成し、それらのクラスの文字列出力をカスタマイズして、Webブラウザにデータを表示するためのWebアプリケーションを迅速に作成しました。

これで、基本的な操作は終了です。今後は、ODP.NETおよびOracle Developer Tools for Visual Studio 11gのリリースを使用して、さらに演習を重ねることを推奨します。 それでは、コーディングを始めてください。

 


Christian Shay christian.shay@oracle.com )氏は、オラクルの主要製品マネージャです。
図6
図6:CUSTOMER_OBJのカスタム生成クラス
図7
図7:アプリケーションの実行