意外と簡単!? .NETでOracle 「GrapeCity コンポーネント FlexGrid 編」

日本オラクル システム営業統括本部
Oracle Direct テクニカルサービス部
大田 浩


目次
はじめに
FlexGridとは
サンプルアプリケーションのインストール
FlexGridからODP.NETの利用
BLOBフィールドへの対応
カーソル変数(REF CURSOR)の利用



 はじめに

 「GrapeCity コンポーネント活用」シリーズは、Microsoft Visual Studio .NETと、VBユーザーや.NETユーザーから高い支持を受けているグレープシティ社のコンポーネント製品を組み合わせたOracle対応アプリケーションの開発方法について説明します。
 実際のサンプルアプリケーションを提供することにより、単なるコーディングTipsにとどまらず、より実践的なアプリケーション開発の資料として構成するようにしております。今回はFlexGrid編ということで、グレープシティ社が提供する「FlexGrid」と、.NETからOracleデータベースへネイティブに接続するためのオラクルのミドルウェアである「Oracle Data Provider for .NET(以下、ODP.NET)を利用したアプリケーションの開発方法について、実際のサンプルアプリケーションを動かしながら確認することができます。今回のサンプルアプリケーションの説明はポイント部分のみのものになりますので、予めご了承ください。
 「意外と簡単!? .NETでOracle」シリーズが.NET開発者でOracleを利用したいという方のシステム構築の一助になれば幸いです。

  「GrapeCity コンポーネント活用」シリーズは以下の編から構成されます。
  1. ActiveReports編
  2. InputMan編
  3. SPREAD編
  4. FlexGrid編(本書)
  「GrapeCity コンポーネント活用」シリーズの「FlexGrid編」は、以下の3つの内容から構成されています。
  1. FlexGridとは
  2. サンプルアプリケーションのインストール
  3. FlexGridとODP.NETを利用した開発
  「GrapeCity コンポーネント活用」シリーズにおける開発環境

データベース・サーバー
OS:Microsoft Windows 2000 Professional + SP4
RDBMS:Oracle Database 10g Release 2 Standard Edition for Windows
開発クライアント
OS:Microsoft Windows 2000 Professional + SP4
開発ツール:Microsoft Visual Studio .NET 2003
開発コンポーネント:GrapeCity FlexGrid for .NET 2.0J



  FlexGridとは

 FlexGridとは、グレープシティ社から提供されている表計算コンポーネントです。主に以下の特長があります。


- グリッドに求められる機能と表現力
グリッドの基本的機能であるデータ編集、マージ、集計計算、ソート、書式設定、印刷(プレビュー)、Excelファイルへの入出力、多数のセル型などの機能をもつ。また、グリッドの内容をツリー状に表示するアウトラインなどの機能により独自のグリッドデザインが可能。

- 製品の使いやすさ
100%マネージコードにより、.NET Frameworkテクノロジーを十分に活かした効率的なプログラミングを実現できる。バウンドモードとアンバウンドモードの違いをほとんど意識せずに使えるほか、シンプルな製品仕様により直感的に操作可能。また、設計時専用のダイアログによる視覚的な設定でコード量が減らせる。

- すぐれた拡張性
セルの編集に任意のコントロールを使用できる、カスタムエディタ機能などの高い拡張性がある。コード付きのカスタムコントロールや、製品機能を拡張したマージやソート、フィルタリング、ハイパーリンクなど多くのサンプルも付属。



 このほかADO.NETとの連結をサポートします。また、連結したグリッドでデータソースに依存しない非連結列を使うことも可能です。グリッド自体がデータを管理するアンバウンドモードは、非常に簡単に使用できますし、当然ADO.NETに準拠したODP.NETも利用できます。FlexGridのより詳細な情報はグレープシティ社の以下のURLを参照してください。


 グレープシティ社 - .NET製品情報
 http://www.grapecity.com/japan/support/database/DOTNET_ProductList.htm

 今回は、FlexGridの2006年1月時点の最新バージョンである「FlexGrid for .NET 2.0J」を使用しています。


メモ: 現在(2006年7月時点)のFlexGridの最新版は、2006年2月24日に発売された「FlexGrid for .NET 3.0J」です。


 サンプルアプリケーションのインストール

 サンプルアプリケーションは以下のサイトよりダウンロードできます。

 http://otndnld.oracle.co.jp/easy/dotnet/flex_grid/sample.zip

 ダウンロードファイル(sample.zip)を任意の一時フォルダに保存し、解凍してください。解凍しますと「CONFIG」、「WindowsForm」という2つのフォルダが作成されます。それぞれのフォルダには以下の情報が格納されています。

- CONFIG
 サンプルアプリケーションを動作させるために必要なテーブルを作成するためのスクリプトが格納されています。
 CONFIGフォルダの下に「first_copy_the_photos_to_c_temp」というフォルダが存在します。
 このフォルダにサンプルアプリケーションで使用する画像が格納されていますので、その画像ファイルを「C:¥Temp」フォルダにコピーしてください。

- WindowsForm
 VB.NETで作成された、Windowsフォームでのサンプルアプリケーションが格納されています。


  Oracleデータベース側の準備

 サンプルアプリケーションを動作させるために、Oracleデータベース側にテスト用のテーブルを作成します。テストテーブルの作成と必要な初期データの作成はすべてスクリプトで自動生成されます。自動生成のためのスクリプトは、sample.zipファイルの解凍後に作成されるフォルダ「CONFIG」下の「gen_FlexGrid.sql」になりますので、こちらを「SQL*PLUS」などから実行します。以下のものが実行結果です。

C:¥>sqlplus /nolog


SQL*Plus: Release 10.2.0.1.0 - Production on 木 2月 2 10:43:52 2006


Copyright (c) 1982, 2005, Oracle. All rights reserved.


SQL> @gen_FlexGrid
systemユーザーのパスワードを入力してください:
接続されました。


ユーザーが作成されました。


権限付与が成功しました。


接続されました。


表が作成されました。


〜 途中省略 〜


1行が作成されました。


1行が作成されました。


SQL>


 「gen_FlexGrid.sql」を実行すると、最初にsystemユーザーのパスワードを求められますので入力してください。以上で、Oracleデータベース側に必要な情報が生成されました。次にサンプルアプリケーションを動かしてみましょう。


  サンプルアプリケーションの動作確認


 サンプルアプリケーションを動作させるためにはFlexGridのコンポーネントがすでにインストールされている必要があります。インストール方法については製品のヘルプ、もしくはグレープシティ社のサイトを参照してください。FlexGridの製品が正常にインストールされた環境で、ダウンロードファイル(sample.zip)解凍後に作成されるWindowsFormディレクトリの下にある、VS.NETのソリューションファイル「FlexGridTest.sln」をVS.NETから開いてください。FlexGridTest.slnファイルに以下の1つのプロジェクトが含まれているのが、ソリューション・エクスプローラから確認できます。


- FlexGridTest(Windowsアプリケーション)
 サンプルアプリケーションの動作確認をおこなう前に、Oracleデータベースに接続するための接続文字列を変更します。接続文字列は、App.Configファイルに記述されています。



 上記のファイルはXMLで記述されています。<appSettings>タグにconnectionStringキーの値が格納されているので、この箇所の値を変更します。ここでは、data sourceの値をtnsnames.oraファイルに記述されたネットサービス名に変更します。


<add key="connectionString"

 value="user id=FlexGrid;password=oracle;data source=orcl10gr2" />



メモ: tnsnames.oraファイルについての詳細は、以下のサイトを参照してください。
Oracle Database Net Services管理者ガイド
10g リリース 2(10.2)ネーミング・メソッドの構成

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/index.htm

 接続文字列を適切に設定したら、次にアプリケーションを実行してみましょう。VS.NETのメニュー「デバッグ(D)」−>「開始(S)」を選択して実行します。



 上の図のようにFlexGridで作成されたWindowsフォームの画面が確認できます。以上でサンプルアプリケーションの動作確認が終わりました。次に、FlexGridからODP.NETを利用するための方法について、コードを交えて説明します。

 FlexGridからODP.NETの利用

 では、実際にFlexGridのコンポーネントからODP.NETを利用して、Oracleに格納された情報を表示してみましょう。


  DataSetの内容をFlexGridで表示


 今回のサンプルアプリケーションは、Oracleデータベースからデータを取得しDataSetに格納、DataSetの内容をFlexGridで表示、修正をおこなうアプリケーションです。FlexGridを利用するクライアントアプリケーションは、WindowsアプリケーションとASP.NET WEBアプリケーションになります。まずは単一の表をFlexGridで表示する手順を説明します。

- DataSetにデータを格納
Oracleデータベースからデータを取得しDataSetに格納する手順は、以下のようになります。
  1. Oracleデータベースへのコネクションの設定
    Oracleに接続するためのコネクションの設定をおこないます。Oracleへのコネクションを確立するためには、どのOracleデータベースにどのユーザーで接続するかという情報を接続文字列として設定する必要があります。接続文字列はコードで記述することも可能ですが、Oracle Developer Tools for Visual Studio .NET(以下、ODT)を利用すると簡単です。ODTを利用したOracleデータベースへの接続について説明します。

    - Oracleエクスプローラにデータ接続の追加
    Oracleエクスプローラの「データ接続」を右クリックし、接続の追加(A)を選択します。



    - 接続先情報の入力
    Oracleデータベースへの接続情報を入力します。

    データソース名 <データソース名>
    ユーザー名 flexgrid
    パスワード oracle



    データソース名は、tnsnames.oraファイルに記述されたネットサービス名になります。
    入力された情報が正しいかどうか確認するために「テスト接続(T)」をクリックすると、以下の画面が表示されます。



    接続が失敗した場合は再度、接続文字列、ユーザー名、パスワードの内容が正しいか確認をしてください。テストの終了後、「接続を追加」ウィンドウで「OK」ボタンをクリックすると、「Oracleエクスプローラ」に接続情報が追加されます。





  2. DataAdapterの設定
    Oracleデータベースへの接続情報の設定が完了したら、次にDataAdapterの設定と、DataSetへ格納する情報の設定をおこないます。DataAdapterの設定にもODTを使用します。今回は、サンプルテーブルである「会社」テーブルを選択し、デザインウィンドウにドラッグ・アンド・ドロップします。




    ドラック・アンド・ドロップ後に、パスワード保存のダイアログが表示されますので、「はい(Y)」をクリックします。




    以上でDataAdapterの作成は完了です。DataAdapterオブジェクトとConnectionオブジェクトが自動生成されているのが、デザインウィンドウで確認できます。




    Oracleエクスプローラからテーブルをドラック・アンド・ドロップした場合にはDataAdapterのSelectCommand、CommandTextプロパティの内容はドラッグ・アンド・ドロップされた単一テーブルのSQLが設定されます。




  3. DataSetへのデータの格納
    DataAdapterの設定が完了したら、次にDataSetにデータを格納するための手順について説明します。上記作業で作成したDataAdapterオブジェクトを右クリックし、「DataSetを生成...」を選択します。




    以上の作業で、DataSetオブジェクトが自動生成されたのがデザインウィンドウから確認できます。




    また、ODTを使用してDataSetオブジェクトを生成すると、型付データセットとして生成され、XMLスキーマファイル(xsdファイル)も自動生成されます。



    ODTにより作成されたDataAdapterからDataSetにデータを格納するには、以下のようなコードになります。

    会社OracleDataAdapter1.Fill(会社11.会社)


    上記コードはDataAdapterのFillメソッドを使用してDataSetにデータを格納しています。今までの説明でDataSetに格納するまではODTを利用すると簡単におこなえることが確認いただけたと思います。次に、DataSetの内容をFlexGridに表示してみましょう。

    - DataSetとFlexGridの連携
    はじめに、FlexGridのコントロールをWindowsフォームにドラッグ・アンド・ドロップします。



    次に、FlexGridコントロールのプロパティを以下のように設定します。
    DataMember : 会社
    DataSource : 会社11



    VS.NETのメニューから、「デバッグ(D)」−>「スタート(S)」を選択して、アプリケーションを実行します。



    DataSetの内容がFlexGridに表示されるのが確認できます。

  BLOBフィールドへの対応

 画像などを扱うBLOBフィールドの内容もFlexGridで表示することができます。今回のサンプルアプリケーションでは、実際にBLOBフィールドに格納された画像をFlexGridで表示しています。ただ、BLOBフィールドに格納された画像データをFlexGridのセルに表示するにはコードを記述する必要があります。以下に、WindowsアプリケーションでBLOBフィールドを使用してコーディングする際の注意点を説明します。


  Windowsアプリケーションによるコーディング


 WindowsアプリケーションでBLOBフィールドに格納された画像情報をFlexGridに表示するためのコードは、以下のようになります。

' OwnerDrawCellイベントを利用して、画像を表示します。

Private Sub fg_OwnerDrawCell(ByVal sender As Object, _

 ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles fg.OwnerDrawCell


   If e.Row >= fg.Rows.Fixed Then


    ' "Photo"列:画像はバイト配列としてデータベースに格納されています。

    If fg.Cols(e.Col).Name = "写真" Then

    'ユーザーのIDを取得します

    Dim userID As Integer = fg.GetData(e.Row, 1)


    ' 画像をロードします。

    e.Image = LoadImage(userID)

    ' 画像を取得できた場合は、TextはNullにします。

    If Not (e.Image Is Nothing) Then

     e.Text = Nothing

    End If

   End If

  End If

End Sub


Function LoadImage(ByVal userID As Integer) As Image

 If IsDBNull(userID) Then

   Return Nothing

 End If


 ' 画像をロードします

 Dim img As Image = Nothing

 Dim cmdImg As New OracleCommand

 Dim rdrImg As OracleDataReader


 ' Connectionが開いていない場合は、Openします

 If Not blobTblOracleConnection1.State = ConnectionState.Open Then

  blobTblOracleConnection1.Open()

 End If

 cmdImg.Connection = blobTblOracleConnection1

 cmdImg.CommandText = "select 写真 from BLOB_TBL where ユーザーコード=:userid"

 cmdImg.Parameters.Add(New OracleParameter("userid", userID))

 rdrImg = cmdImg.ExecuteReader


 If rdrImg.Read Then

  Dim blob As OracleBlob = rdrImg.GetOracleBlob(0)

  Dim stmPic As New MemoryStream(blob.Value)

  'MemoryStreamのサイズが0の場合は、Nothingに戻ります

  If Not stmPic.Length > 0 Then

   rdrImg.Close()

   blobTblOracleConnection1.Close()


   Return Nothing

  End If


  img = Image.FromStream(stmPic)

 End If


 rdrImg.Close()

 blobTblOracleConnection1.Close()


 Return img


End Function

リスト.1 frmBlob.vb - Sub LoadImage


 今回はFlexGridのOwnerDrawCellイベント内で、画像をBLOB列から取得して表示しています。





  カーソル変数(REF CURSOR)の利用

 カーソル変数は、PL/SQLパッケージと様々なクライアントとの間で問い合わせ結果セットを受け渡すために使用されます。また、PL/SQLブロックを使用して複数のホスト・カーソル変数を1回のラウンドトリップでオープン/クローズすることが可能ですので、ネットワークの通信量を削減することもできます。では、カーソル変数を使用して複数の結果セットを取得し、FlexGridに表示させてみましょう。


  PL/SQLパッケージの作成


 まず、「ユーザー」「会社」テーブルのカーソル変数を返すPL/SQLパッケージを作成します。このPL/SQLパッケージは、サンプルスクリプトSQLである「gen_FlexGrid.sql」を実行していた場合は、すでに作成されています。

CREATE OR REPLACE PACKAGE FLEXGRID.REFCUR_TEST AS

 TYPE UserCurTyp IS REF CURSOR RETURN ユーザー%ROWTYPE;


 CURSOR c1 IS SELECT * FROM 会社;

 TYPE CompCurTyp IS REF CURSOR RETURN c1%ROWTYPE;


 PROCEDURE open_cv(user_cv IN OUT UserCurTyp, comp_cv IN OUT CompCurTyp);

END;

/


CREATE OR REPLACE PACKAGE BODY FLEXGRID.REFCUR_TEST AS

 PROCEDURE open_cv(user_cv IN OUT UserCurTyp, comp_cv IN OUT CompCurTyp) IS

 BEGIN

  OPEN user_cv FOR SELECT * FROM ユーザー;

  OPEN comp_cv FOR SELECT * FROM 会社;

 END open_cv;

END;

/


  フォームの設定


 今回は2つのテーブルを1つのFlexGridコントロールで表示します。以下の画面のようにボタンを2つ用意して、それぞれ表示するデータを切り替えます。




  コードの記述


 最後に、上記で作成したフォームのロードイベントに、カーソル変数のデータをFlexGridに表示するためのコードを記述します。コードの内容は以下のようになります。

Private Sub Form1_Load(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles MyBase.Load


 Cnn.ConnectionString = ConfigurationSettings.AppSettings("connectionString")

 Cnn.Open()


 'コマンドの準備

 cmd = New OracleCommand("REFCUR_TEST.open_cv", Cnn)

 cmd.CommandType = CommandType.StoredProcedure


 'REF CURSORパラメータのバインド

 cmd.Parameters.Add("emp_cv", OracleDbType.RefCursor, ParameterDirection.Output)

 cmd.Parameters.Add("dept_cv", OracleDbType.RefCursor, ParameterDirection.Output)


 'DataSetへのセット

 da = New OracleDataAdapter(cmd)

 da.Fill(dsList, "data")


 'FlexGridに表示

 fg.DataSource = dsList.Tables(0)


 Cnn.Close()

 Cnn.Dispose()

End Sub


Private Sub ButtonUser_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonUser.Click

 fg.DataSource = dsList.Tables(0)

End Sub


Private Sub ButtonComp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonComp.Click

 fg.DataSource = dsList.Tables(1)

End Sub

リスト.2 frmRefcursor.vb - Sub Form1_Load


上記コードを実行すると、カーソル変数に格納されたユーザーテーブルと会社テーブルをそれぞれ1回のラウンドトリップで取得し、表示するアプリケーションが実行できます。




以上のように、Oracleの機能とFlexGridの機能を組み合わせることにより、柔軟なアプリケーションを開発することができます。ぜひ、お試しください。