Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

帳票Webアプリ実践構築ガイド
ActiveReports for .NETを使いこなす!~その2

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/06/12 15:00
目次

データアクセスサービスを作成

 実際のシステム構築でWebアプリを作成する際に、重要なポイントの1つとして「データをどこに保存するか」ということがあります。データの保存方法によってアプリ構造も変わりますし、セキュリティに関しても相違がでます。そこで、まずデータの保存場所から考察してみたいと思います。

 今回のサンプルでは、データ取得部分をASP.NET Webサービスとして実装します。これは、Webアプリの場合、セキュリティを考慮すると、【図3】のようにWebサーバとDBアクセスロジックはファイアウォールにて分離しておき、外部から接続できるゾーンからはDBに接続しないようにした方がよいからです。

図3 データベースWebアプリケーションのお勧めシステム構成
図3 データベースWebアプリケーションのお勧めシステム構成

データアクセス用ASP.NET Webサービスを作成

 実務に耐え得るものを作るのであれば、SQL ServerやOracle DatabaseなどのRDBMSをデータ格納場所とした方がよいのですが、今回は、サンプル環境構築の手軽さを考慮してmdbファイルをデータ格納場所としています。そのため、新しいWebサイトとしてASP.NET Webサービスのプロジェクトを作成して、mdbファイルをASP.NET Webサービスの「App_Data」フォルダに配置しています。

 なお、ASP.NET WebサービスでApp_Dataフォルダに配置したmdbファイルを指定する場合、「System.IO.Path.Combine(My.Request.PhysicalApplicationPath, "App_Data\BILL.MDB")」のように指定します。

 ASP.NET Webサービスを作成するには、Visual Studioの画面上で[ファイル]‐[新しいWebサイト]より、新しいASP.NET Webサービスのプロジェクトを作成します。

図4 ASP.NET Webサービスのプロジェクトを作成
図4 ASP.NET Webサービスのプロジェクトを作成

クラスにコードを記述

 新しい項目の追加で、WebサービスとしてBillBound.asmxをプロジェクトに追加します。

図5 BillBound.asmxの追加
図5 BillBound.asmxの追加

 BillBound.asmxに対するコードは、App_CodeフォルダのBillBound.vbの中に記述します。その中で、mdbファイルからデータを取得してDataSetを作成するコードを記述します。このようにデータアクセス部分はASP.NET Webサービスとして分離しておいた方が、コードの見通しがよくなります。また、データソースをSQL ServerやOracleなどに切り替える時も、ASP.NET Webサービス側の差し替えだけで対応可能な構造で作りやすいです。

 ASP.NET Webサービスのメソッドは、WebMethod属性をつける以外、クラスファイルのメソッドと基本的に同じです(リスト1参照)。GetRecordsメソッドの中では、System.Data.OleDbのOleDbDataAdapterを使って、mdbファイルからDataSetに帳票に表示するデータを格納しています。このDataSetが、Webメソッドの戻り値として呼び出し元に返却されます。

リスト1 BillBound.vb
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Data
Imports System.Data.OleDb

<WebService(Description:="ActiveReportsサンプル用サービス", _
            Namespace:="http://hatsune.wankuma.local/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class BillBound
    Inherits System.Web.Services.WebService
    Private block As Object = Nothing

    ''' <summary>
    ''' 請求書データを取得する
    ''' </summary>
    ''' <param name="userID">(IN)DBユーザ</param>
    ''' <param name="password">(IN)DBパスワード</param>
    ''' <param name="customerID">お客様ID(String.Emptyの場合すべて)</param>
    ''' <returns>DataSet</returns>
    ''' <remarks></remarks>
    <WebMethod(EnableSession:=False, _
               Description:="請求書データを取得する")> _
    Public Function GetRecords(ByVal userID As String, _
                               ByVal password As String, _
                               ByVal customerID As String) As DataSet
        Dim connectionString As String = _
            "Provider=Microsoft.Jet.OLEDB.4.0;Password={1};User ID={0};" & _
            "Data Source=" & _
                     System.IO.Path.Combine(My.Request.PhysicalApplicationPath, _
                                                             "App_Data\BILL.MDB")
        Dim ds As New DataSet

        Using _cn As New OleDb.OleDbConnection(String.Format(connectionString, _
                                                            userID, password))
            _cn.Open()
            Using _cmd As New OleDb.OleDbCommand
                Dim sqlString As String = _
                    "SELECT Bill.*, BillCondition.*, Customers.CustomerName " & _
                      "FROM Customers " & _
                     "INNER JOIN (Bill INNER JOIN BillCondition " & _
                                         "ON Bill.BillNo = BillCondition.BillNo)" & _
                        "ON Customers.CustomerID = Bill.CustomerID " & _
                     "ORDER BY Bill.CustomerID,Bill.BillNo,Bill.Date,Bill.SlipNo"
                _cmd.CommandText = sqlString
                _cmd.Connection = _cn
                Using _da As New OleDb.OleDbDataAdapter
                    _da.SelectCommand = _cmd
                    _da.Fill(ds)
                    'Priceを計算する
                    For Each row As DataRow In ds.Tables(0).Rows
                        row.BeginEdit()
                        row("Price") = CType(row("Number"), Decimal) * _
                                       CType(row("UnitPrice"), Decimal)
                        row.EndEdit()
                    Next
                End Using
            End Using
            _cn.Close()
        End Using
        Return ds
    End Function
End Class

 リスト1の概要は、下記のとおりです。

  1. 返却用DataSetとしてdsデータセットを生成
  2. OleDbConnectionの接続先として、App_DataフォルダのBILL.MDBファイルをJET(Windows OS標準搭載のMDBファイル用データアクセスミドルウェア)OLE DBプロバイダを使って指定し、Openメソッドで指定したMDBファイルの利用を開始
  3. OleDbCommandのCommandTextプロパティにデータ取得用SELECT SQL文を設定し、接続先としてOleDbConnectionを設定
  4. OleDbDataAdapterを生成して3.で定義したOleDbCommandをSelectCommandプロパティに設定し、FillメソッドでのSELECT文として採用
  5. FillメソッドでdsデータセットにSELECT結果をすべて格納
  6. For Each row As DataRow In ds.Tables(0).Rowsにより、すべての行のPrice列を計算

ASP.NET Webサービスをテスト

 ASP.NET Webサービスにデータアクセスのコードが記述できたら、テスト実行してみましょう。

 [デバッグ]-[デバッグ実行]メニューをクリックすると、自動的にブラウザが起動され、ASP.NET Webサービスのポータルサイトが表示されます。

図6 BillBoundサービスのテスト実行
図6 BillBoundサービスのテスト実行

 [GetRecords]をクリックすると、GetRecordsメソッドによってテストサイトが開きます。ここで[userID]パラメタに「admin」と入力して[起動]ボタンをクリックすれば、Webメソッドが実行され、帳票に表示するデータがXML形式で表示されます。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 初音玲(ハツネアキラ)

     国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。  個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。  Microsoft MVP for Windows Development...

バックナンバー

連載:現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ActiveReports)

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5