「GrapeCity コンポーネント活用」シリーズは、Microsoft Visual Studio .NETと、VBユーザーや.NETユーザーから高い支持を受けているグレープシティ社のコンポーネント製品を組み合わせたOracle対応アプリケーションの開発方法について説明します。
実際のサンプルアプリケーションを提供することにより、単なるコーディングTipsにとどまらず、より実践的なアプリケーション開発の資料として構成するようにしております。今回はFlexGrid編ということで、グレープシティ社が提供する「FlexGrid」と、.NETからOracleデータベースへネイティブに接続するためのオラクルのミドルウェアである「Oracle Data Provider for .NET(以下、ODP.NET)を利用したアプリケーションの開発方法について、実際のサンプルアプリケーションを動かしながら確認することができます。今回のサンプルアプリケーションの説明はポイント部分のみのものになりますので、予めご了承ください。 「意外と簡単!? .NETでOracle」シリーズが.NET開発者でOracleを利用したいという方のシステム構築の一助になれば幸いです。
FlexGridとは、グレープシティ社から提供されている表計算コンポーネントです。主に以下の特長があります。
このほか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」を使用しています。
サンプルアプリケーションは以下のサイトよりダウンロードできます。
http://otndnld.oracle.co.jp/easy/dotnet/flex_grid/sample.zip ダウンロードファイル(sample.zip)を任意の一時フォルダに保存し、解凍してください。解凍しますと「CONFIG」、「WindowsForm」という2つのフォルダが作成されます。それぞれのフォルダには以下の情報が格納されています。
サンプルアプリケーションを動作させるために、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つのプロジェクトが含まれているのが、ソリューション・エクスプローラから確認できます。
では、実際にFlexGridのコンポーネントからODP.NETを利用して、Oracleに格納された情報を表示してみましょう。
画像などを扱うBLOBフィールドの内容もFlexGridで表示することができます。今回のサンプルアプリケーションでは、実際にBLOBフィールドに格納された画像をFlexGridで表示しています。ただ、BLOBフィールドに格納された画像データをFlexGridのセルに表示するにはコードを記述する必要があります。以下に、WindowsアプリケーションでBLOBフィールドを使用してコーディングする際の注意点を説明します。
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列から取得して表示しています。 ![]()
カーソル変数は、PL/SQLパッケージと様々なクライアントとの間で問い合わせ結果セットを受け渡すために使用されます。また、PL/SQLブロックを使用して複数のホスト・カーソル変数を1回のラウンドトリップでオープン/クローズすることが可能ですので、ネットワークの通信量を削減することもできます。では、カーソル変数を使用して複数の結果セットを取得し、FlexGridに表示させてみましょう。
まず、「ユーザー」「会社」テーブルのカーソル変数を返す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の機能を組み合わせることにより、柔軟なアプリケーションを開発することができます。ぜひ、お試しください。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||