「GrapeCity コンポーネント活用」シリーズは、Microsoft Visual Studio.NETとVBユーザーや.NETユーザーから高い支持を受けているグレープシティ社のコンポーネント製品を組み合わせたOracle対応アプリケーションの開発方法について説明します。
実際のサンプルアプリケーションを提供することにより、単なるコーディングTipsにとどまらず、より実践的なアプリケーション開発の資料として構成するようにしております。今回はSPREAD編ということで、グレープシティ社が提供しているSPREADとOracleが提供している.NETからOracleデータベースへネイティブに接続するためのミドルウェアである「Oracle Data Provider for .NET(以下、ODP.NET)を利用したアプリケーションの開発方法について、実際のサンプルアプリケーションを動かしながら確認することができます。今回のサンプルアプリケーションの説明はポイントとなる部分のみの説明になりますので予めご了承ください。 「意外と簡単!? .NETでOracle」シリーズが.NET開発者でオラクルを利用したい方のシステム構築の一助になれば幸いです。
SPREADとは、グレープシティ社から提供されている表計算コンポーネントになります。主に以下の特徴があります。
このほかIDEと同様のプロパティウィンドウにより、SPREAD本体、SPREADシート、行、列、ヘッダおよびセルの各レベルにおけるプロパティの設定をすべてデザイナ上でおこなうことができます。ユーザーインタフェースデザインのためのコーディング作業時間を大幅に短縮できます。SPREADのより詳細な情報はグレープシティ社の以下のURLを参照してください。 グレープシティ社 - .NET製品情報 http://www.grapecity.com/japan/support/database/DOTNET_ProductList.htm 今回はSPREADの2006年1月時点で最新版のバージョンである、「SPREAD for .NET Windows Forms Edition」と「SPREAD for .NET 2.0J Web Forms Edition」を使用しております。
サンプルアプリケーションは以下のサイトよりダウンロードできます。 http://otndnld.oracle.co.jp/easy/dotnet/spread/sample.zip ダウンロードファイル(sample.zip)を任意の一時フォルダに保存し、解凍してください。解凍しますと「CONFIG」、「WebForms」、「WindowsForm」という3つのフォルダが作成されます。それぞれのフォルダには以下の情報が格納されています。
サンプルアプリケーションを動作させるために、Oracleデータベース側にテスト用のテーブルを作成します。テストテーブルの作成と必要な初期データの作成は全てスクリプトで自動生成されます。自動生成のためのスクリプトはsample.zipファイルを解凍後に作成されるフォルダ「CONFIG」下の「gen_SPREAD.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_SPREAD systemユーザーのパスワードを入力してください: 接続されました。 ユーザーが作成されました。 権限付与が成功しました。 接続されました。 表が作成されました。 〜 途中省略 〜 1行が作成されました。 1行が作成されました。 SQL> 「gen_SPREAD.sql」を実行すると、最初にsystemユーザーのパスワードを入力する必要がありますのでパスワードを入力してください。以上でOracleデータベース側に必要な情報が生成されました。次にIISの設定をおこないます。
ダウンロードファイル(sample.zip)を解凍後に作成されるWebFormsディレクトリをInternet Information Services(IIS)から参照できるように以下の手順に従って設定します。今回は sample.zipファイルを「C:\SPREAD」ディレクトリに展開したという想定で説明をおこないます。解凍後のディレクトリ構成は以下のようになります。 ![]() 「WebForms」フォルダに格納されているASP.NET WEBアプリケーションをIISに登録する手順は以下のようになります。
IIS上での設定が終わりましたら、次にサンプルアプリケーションの動作確認をおこなってみましょう。サンプルアプリケーションを動作させるためにはSPREADのコンポーネントが既にインストールされている必要があります。こちらのインストール方法については製品のヘルプ、もしくはGrapeCity社のサイトを参照してください。SPREADの製品が正常にインストールされた環境で、ダウンロードファイル(sample.zip)を解凍後に作成されるSPREADディレクトリ下にある、VS.NETのソリューションファイル「SpreadTest.sln」をVS.NETから開いてください。SpreadTest.slnファイルには以下の2つのプロジェクトが含まれているのが、ソリューション・エクスプローラから確認できます。
![]() サンプルアプリケーションの動作確認をおこなう前に、Oracleデータベースに接続するための接続文字列を変更します。接続文字列は、以下のプロジェクト毎にそれぞれ記述されています。
![]() 上記のファイルはXMLで記述されています。<appSettings>タグにconnectionStringキーの値が格納されているので、この箇所の値を変更します。変更箇所は、data sourceの値をtnsnames.oraファイルに記述された、ネットサービス名になります。 <add key="connectionString" value="user id=spread;password=oracle;data source=orcl10gr2" />
接続文字列を適切に設定したら、次にアプリケーションを実行してみましょう。はじめにASP.NETで作成されたWEBアプリケーションを実行します。VS.NETのソリューション・エクスプローラから「SpreadTestWeb」プロジェクトを右クリックし、「スタートアップ プロジェクトに設定(A)」を選択します。 ![]() 次に、VS.NETのメニュー「デバッグ(D)」−>「開始(S)」を選択して実行します。 ![]() 以上のようにSPREADで作成されたWEBページが確認できます。次にWindowsアプリケーションで確認をおこなってみましょう。VS.NETのソリューション・エクスプローラから「SpreadTestWin」プロジェクトを右クリックし、「スタートアップ プロジェクトに設定(A)」を選択します。 ![]() 次に、VS.NETのメニュー「デバッグ(D)」−>「開始(S)」を選択して実行します。 ![]() 以上のようにSPREADで作成されたWindowsフォームの画面が確認できます。以上でサンプルアプリケーションの動作確認をおこないました。次に、SPREADからODP.NETを利用するための方法について、コードを交えて説明します。
では、実際にSPREADのコンポーネントからODP.NETを利用してOracleに格納された情報の表示をおこなってみましょう。
今回のサンプルアプリケーションでは、Oracleデータベースからデータを取得しDataSetに格納、DataSetの内容をSPREADで表示、修正がおこなうサンプルアプリケーションになります。SPREADを利用するクライアントアプリケーションは、WindowsアプリケーションとASP.NET WEBアプリケーションになります。まずは単一の表をSPREADで表示する手順を説明します。Windowsアプリケーションでの説明になりますが、基本的な手順はASP.NET WEBアプリケーションも同様になります。
画像などを扱うBLOBフィールドの内容もSPREADで表示が可能です。今回のサンプルアプリケーションでは実際にBLOBフィールドに格納された画像をSPREADで表示しています。ただ、BLOBフィールドに格納された画像データをSPREADのセルに表示するのはコードを記述する必要があります。以下、Windowsアプリケーション、ASP.NET WEBアプリケーションでそれぞれBLOBフィールドを使用した場合のコーディングする際の注意点を説明します。
WindowsアプリケーションでBLOBフィールドに格納された画像情報をSPREADに表示するには以下のようなコードになります。
' SPREADで、指定された行の写真を表示します
Private Sub ShowphotoInSpread(ByVal row As Integer) ' 画像データの存在チェック If Not IsDBNull(ds.BlobTbl.Rows(row).Item(3)) Then 'DataSetから画像データをByte配列として取得 Dim imgData As Byte() = CType(ds.BlobTbl.Rows(row).Item(3), Byte()) '画像をセルに表示 Dim stmPic As New MemoryStream(imgData) Dim imgType As New FarPoint.Win.Spread.CellType.GeneralCellType imgType.BackgroundImage = _ New FarPoint.Win.Picture(Image.FromStream(stmPic)) FpSpread1.Sheets(0).Cells(row, 3).CellType = imgType End If End Sub リスト.1 frmBlob.vb - Sub ShowphotoInSpread SPREADのセルには画像を背景として表示する機能があります。BackgoundImageプロパティに画像情報を設定するとSPREADのセル内に画像を表示することが可能です。 ![]()
今度は、BLOBフィールドの画像情報をASP.NET WEBアプリケーションで表示させてみましょう。以下のようなコードになります。
' Spreadで、指定された行の写真を表示します
Private Sub ShowphotoInSpread(ByVal row As Integer) ' 画像データの存在チェック If Not IsDBNull(ds.BlobTbl.Rows(row).Item(3)) Then 'DataSetから画像データをByte配列として取得 Dim imgData As Byte() = CType(ds.BlobTbl.Rows(row).Item(3), Byte()) ' 画像をファイルとして出力 Dim strUserCode As String = get_user_code_by_row(row) Dim imgfilePhyPath As String = Server.MapPath(".") & "\" & _ strUserCode & ".gif" Dim imgfileLogPath As String = strUserCode & ".gif" Dim imgfile As New System.IO.FileStream(imgfilePhyPath, IO.FileMode.Create) imgfile.Write(imgData, 0, imgData.Length) imgfile.Close() '画像をセルに表示 FpSpread1.ActiveSheetView.Cells(row, 3).CellType = _ New FarPoint.Web.Spread.ImageCellType(imgfileLogPath) FpSpread1.ActiveSheetView.Cells(row, 3).Text = "" End If End Sub リスト.2 blobtest.aspx.vb - Sub ShowphotoInSpread ASP.NET WEBアプリケーションの場合は、BLOBフィールドに格納された画像データをSPREADに表示することができません。一度BLOBフィールドの画像をファイルとして保存し、SPREADのImageCellTypeプロパティで画像ファイルのURLをフルパスで指定する必要があります。 ![]() 今まで説明したBLOBフィールドによる画像ファイルの表示は、BFILEフィールドでも同様になります。Windowsアプリケーションでは、そのまま画像をSPREADのセルに表示できますが、ASP.NET WEBアプリケーションでは一旦ファイルに保存してから、SPREADのセルに表示する必要がありますので注意してください。
カーソル変数は、PL/SQLパッケージと様々なクライアントの間で問い合わせ結果セットを渡すために使用されます。また、PL/SQLブロックを使用して複数のホスト・カーソル変数を1回のラウンドトリップでオープン/クローズすることが可能ですので、ネットワークの通信量を削減することもできます。では実際に、カーソル変数を使用して複数の結果セットを取得し、SPREADに表示してみましょう。
まず、「ユーザー」「会社」テーブルのカーソル変数を返す、PL/SQLパッケージを作成します。こちらのPL/SQLパッケージはサンプルスクリプトSQLである、「gen_spread.sql」を実行していた場合は、既に作成されています。
CREATE OR REPLACE PACKAGE SPREAD.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 SPREAD.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つのSPREADコントロールで表示します。SPREADコントロールのプロパティから、「Sheets」プロパティの「…」ボタンをクリックします。
![]() デフォルトで1つのシートメンバが作成されているので、「追加(A)」ボタンをクリックして、シートを追加します。合計2つのシートメンバを作成します。 ![]()
最後に、上記で作成したフォームのロードイベントにカーソル変数のデータをSPREADに表示するためのコードを記述します。コードの内容は以下のようになります。
Imports Oracle.DataAccess.Client
Imports Oracle.DataAccess.Types Imports System.Configuration Public Class fmRefcursor Inherits System.Windows.Forms.Form #Region " Windows フォーム デザイナで生成されたコード " 〜 省略 〜 #End Region Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'データベースへの接続情報 Dim conn As New OracleConnection( _ ConfigurationSettings.AppSettings("connectionString")) 'コマンドの準備 Dim cmd As New OracleCommand("REFCUR_TEST.open_cv", conn) cmd.CommandType = CommandType.StoredProcedure 'REF CURSORパラメータのバインド cmd.Parameters.Add("user_cv", _ OracleDbType.RefCursor, ParameterDirection.Output) cmd.Parameters.Add("comp_cv", _ OracleDbType.RefCursor, ParameterDirection.Output) 'DataSetへのセット Dim ds As New DataSet Dim da As New OracleDataAdapter(cmd) da.Fill(ds, "data") 'データの表示 With FpSpread1.Sheets(0) .DataSource = ds .DataMember = "data" End With With FpSpread1.Sheets(1) .DataSource = ds .DataMember = "data1" End With conn.Close() conn.Dispose() End Sub End Class リスト.3 frmRefcursor.vb - Sub Form1_Load 上記コードを記述したら、実行すると2つのシートをもったSPREADコントロールが確認できます。 ![]() 以上のように、Oracleの機能とSPREADの機能を組み合わせることにより柔軟なアプリケーションを開発できます。是非、お試しください。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||