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

日本オラクル クロスインダストリー統括本部
OracleDirect テクニカルサービスグループ
大田 浩


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



 はじめに

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

  「GrapeCity コンポーネント活用」シリーズは以下の4つの構成を予定しています。
  1. ActiveReports編
  2. InputMan編
  3. SPREAD編(本書)
  4. FlexGrid編
  「GrapeCity コンポーネント活用」シリーズの「SPREAD編」は、以下の3つの内容から構成しております。
  1. SPREADとは
  2. サンプルアプリケーションのインストール
  3. SPREADと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 SPREAD for .NET Windows Forms Edition
SPREAD for .NET 2.0J Web Forms Edition



  SPREADとは

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


- 豊かな表現力
 マルチヘッダ表示やセル結合、データに応じた自動マージなどの機能のほか、マルチシート、アルファブレンディングやカスタマイズ可能な罫線などが加わり、すぐれた表現力を持っています。

- エンドユーザーにやさしい操作性
 アルファベットや数字入力のほか、日本語入力のための、ひらがな・カタカナ・半角カタカナの入力モードを提供しています。半角英数字のみの入力制御もプロパティの設定だけで簡単に実現できます。テキストセルではそれぞれの入力モードに合わせてIMEモードも自動的に切り替わり、エンドユーザーに自然な入力環境を提供します。
 また、列や行の固定表示とは別に、SPREADシートを画面上で複数に分割することができるマルチスプリッタ機能やシート上の表示サイズを自由に変更できるズーム機能を装備します。

- 強力なデータベースサポート
 ADO.NETとシームレスに連携するデータモデルの採用により、リレーションに応じたデータの階層表示や、高速なデータ接続を実現しました。本格的なデータベースアプリケーションの開発にも高いパフォーマンスを発揮します。また、.NET環境からOracle データベースへのネイティブ接続が可能なOracle Data Provider for .NET(以下、ODP.NET)にも対応しています。

- 多彩な印刷機能
 標準的なグリッド印刷や、印刷設定に応じて自動的に用紙方向やサイズ調整を行うスマート印刷、複数のSPREADを同一ページに印刷できるユーザー定義印刷の3つの印刷機能を提供します。目的に合わせて適切な印刷方法を選択することができます。


 このほか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つのフォルダが作成されます。それぞれのフォルダには以下の情報が格納されています。

- CONFIG
サンプルアプリケーションを動作させるために必要なテーブルを作成するためのスクリプトが格納されています。

- WebForms
ASP.NETで作成されたサンプルアプリケーションが格納されています。

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


  Oracleデータベース側の準備


 サンプルアプリケーションを動作させるために、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の設定をおこないます。


  Internet Information Services(IIS)の設定 (アプリケーション・サーバー上での設定)


 ダウンロードファイル(sample.zip)を解凍後に作成されるWebFormsディレクトリをInternet Information Services(IIS)から参照できるように以下の手順に従って設定します。今回は sample.zipファイルを「C:\SPREAD」ディレクトリに展開したという想定で説明をおこないます。解凍後のディレクトリ構成は以下のようになります。



「WebForms」フォルダに格納されているASP.NET WEBアプリケーションをIISに登録する手順は以下のようになります。


1. 仮想ディレクトリの作成
Windowsエクスプローラを使用して、IISから利用する仮想ディレクトリを作成します。WebFormsフォルダを右クリックし、[共有とセキュリティ]をクリックします。


フォルダプロパティの[WEB共有]タブの[共有]ボックスで、「仮想ディレクトリを作成する」を選択します。


[エイリアス編集]ダイアログボックスの[エイリアス]ボックスに、仮想ディレクトリの名前を入力します。今回は「SpreadTestWeb」と入力します。


「OK」ボタンをクリックすることにより仮想ディレクトリの設定が完了します。



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

 IIS上での設定が終わりましたら、次にサンプルアプリケーションの動作確認をおこなってみましょう。サンプルアプリケーションを動作させるためにはSPREADのコンポーネントが既にインストールされている必要があります。こちらのインストール方法については製品のヘルプ、もしくはGrapeCity社のサイトを参照してください。SPREADの製品が正常にインストールされた環境で、ダウンロードファイル(sample.zip)を解凍後に作成されるSPREADディレクトリ下にある、VS.NETのソリューションファイル「SpreadTest.sln」をVS.NETから開いてください。SpreadTest.slnファイルには以下の2つのプロジェクトが含まれているのが、ソリューション・エクスプローラから確認できます。


- SpreadTestWeb(ASP.NET WEBアプリケーション)
- SpreadTestWin(Windowsアプリケーション)



 サンプルアプリケーションの動作確認をおこなう前に、Oracleデータベースに接続するための接続文字列を変更します。接続文字列は、以下のプロジェクト毎にそれぞれ記述されています。

- SpreadTestWeb −> Web.config
- SpreadTestWin −> App.config



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



<add key="connectionString"

value="user id=spread;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_v8/nav/portal_3.htm


 接続文字列を適切に設定したら、次にアプリケーションを実行してみましょう。はじめに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の利用

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


  DataSetの内容をSPREADで表示


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

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

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




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

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



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



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





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




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




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




    Oracleエクスプローラからテーブルをドラック・アンド・ドロップした場合にはDataAdapterのSselectCommand、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の内容をSPREADに表示してみましょう。

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



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



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



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

  BLOB型フィールドへの対応

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


Windowsアプリケーションでのコーディング


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のセル内に画像を表示することが可能です。





ASP.NET WEBアプリケーションでのコーディング


今度は、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のセルに表示する必要がありますので注意してください。


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

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


PL/SQLパッケージの作成


 まず、「ユーザー」「会社」テーブルのカーソル変数を返す、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;

/


  SPREAD側の設定


 今回は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の機能を組み合わせることにより柔軟なアプリケーションを開発できます。是非、お試しください。