データアクセスサービスを作成
実際のシステム構築でWebアプリを作成する際に、重要なポイントの1つとして「データをどこに保存するか」ということがあります。データの保存方法によってアプリ構造も変わりますし、セキュリティに関しても相違がでます。そこで、まずデータの保存場所から考察してみたいと思います。
今回のサンプルでは、データ取得部分をASP.NET Webサービスとして実装します。これは、Webアプリの場合、セキュリティを考慮すると、【図3】のようにWebサーバとDBアクセスロジックはファイアウォールにて分離しておき、外部から接続できるゾーンからはDBに接続しないようにした方がよいからです。
データアクセス用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サービスのプロジェクトを作成します。
クラスにコードを記述
新しい項目の追加で、Webサービスとして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メソッドの戻り値として呼び出し元に返却されます。
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の概要は、下記のとおりです。
- 返却用DataSetとしてdsデータセットを生成
- OleDbConnectionの接続先として、App_DataフォルダのBILL.MDBファイルをJET(Windows OS標準搭載のMDBファイル用データアクセスミドルウェア)OLE DBプロバイダを使って指定し、Openメソッドで指定したMDBファイルの利用を開始
- OleDbCommandのCommandTextプロパティにデータ取得用SELECT SQL文を設定し、接続先としてOleDbConnectionを設定
- OleDbDataAdapterを生成して3.で定義したOleDbCommandをSelectCommandプロパティに設定し、FillメソッドでのSELECT文として採用
- FillメソッドでdsデータセットにSELECT結果をすべて格納
- For Each row As DataRow In ds.Tables(0).Rowsにより、すべての行のPrice列を計算
ASP.NET Webサービスをテスト
ASP.NET Webサービスにデータアクセスのコードが記述できたら、テスト実行してみましょう。
[デバッグ]-[デバッグ実行]メニューをクリックすると、自動的にブラウザが起動され、ASP.NET Webサービスのポータルサイトが表示されます。
[GetRecords]をクリックすると、GetRecordsメソッドによってテストサイトが開きます。ここで[userID]パラメタに「admin」と入力して[起動]ボタンをクリックすれば、Webメソッドが実行され、帳票に表示するデータがXML形式で表示されます。