特集:効率的なデータベース開発の実践

DBアクセス用のXML Webサービスとは?

初音玲
2009/02/06

XML WebサービスにDBアクセスを実装する

 まず「DbAccessService」という名前でASP.NET Webサービス・プロジェクト(Webサイト)を作成する。自動生成されるService.asmxファイルとApp_CodeフォルダのService.vbファイルは不要なので削除しておこう。

 次に「DbAccessServiceTest」という名前でテスト・プロジェクトを作成する。自動生成されるManualTest1.mhtファイルとUnitTest1.vbファイルは削除しておこう。

 最初にXML WebサービスのWebメソッドを作成する。今回は、認証処理を行うXML Webサービス(以下、Authサービス)とDBアクセス処理を行うXML Webサービス(以下、DbAccessServiceサービス)の2つを作成する。これには、メニュー・バーから[ファイル]−[新規作成]−[ファイル]を選択して、表示される[新しい項目の追加]ダイアログで[テンプレート]から「Web サービス」を選択し、[名前]に任意のサービス名(Authサービスの場合は「Auth.asmx」、DbAccessServiceサービスの場合は「DbAccessService.asmx」)を入力して、[OK]ボタンをクリックすればよい。App_Codeフォルダに自動生成された.vbファイルにはHelloWorldメソッドが自動生成されるので削除しておく。

【コラム】複数のXML Webサービスを構築するときの注意点

 今回の実装では、1つのASP.NET Webサービス・プロジェクト(DbAccessService)に、AuthサービスとDbAccessServiceサービスの2つのXML Webサービスを実装するが、このように複数のXML Webサービスを実装することもできる(つまり、.asmxファイルを複数作成できる)。複数のXML Webサービスを用意する場合、1つのXML Webサービスを実装したASP.NET Webサービス・プロジェクトを複数作成する、あるいは、複数のXML Webサービスを実装したASP.NET Webサービス・プロジェクトを1つだけ作成する、という2つの実装形式が考えられるが、どちらがよいかは状況に応じて異なってくる。

 例えば、ASP.NETではプロジェクトごとに仮想フォルダが別になり、アクセス権や資源管理などもそれぞれで管理できる。この特性を考えると、関連するXML Webサービスは1つのASP.NET Webサービス・プロジェクトにまとめて管理を集約し、関連度が低いXML Webサービスは別のASP.NET Webサービス・プロジェクトに分離して別管理にした方が効率的である。今回のAuthサービスとDbAccessServiceサービスは関連するXML Webサービスであるため、1つのASP.NET Webサービス・プロジェクトにまとめている。

 それでは、DBアクセス用のWebメソッドを実装していこう。

Webメソッドのパラメータを考察する

 DBアクセスを行うWebメソッドを呼び出すときに必要な入力パラメータを考察する。DBアクセスに必要なパラメータとしては次の3つが考えられる。

  • ユーザーID
  • パスワード
  • 接続先DBサーバ情報

 この中で、接続先DBサーバ情報はマシン構成に依存するものなので、XML WebサービスのWeb.Configなどに記述する固定パラメータと考えて問題ない。しかし、ユーザーIDはDBアクセス権やDB監査機能などを考慮すると、利用者ごとに別々の値を取りたい。

 よって、ユーザーID(および、そのパスワード)はサーバ側で定義するのではなく、Webメソッドの入力パラメータとする方がよい。今回の記事ではすべてのWebメソッドについて、ユーザーIDとパスワードを入力パラメータとして定義することにしよう。

 それでは、実際に利用者の認証を行う(Authサービスの)Webメソッド(以下、利用者認証Webメソッド)を作成していこう。

(1)利用者認証Webメソッドの考察

 DBを使った利用者認証であれば、ユーザーIDとパスワードだけで十分に思えるが、できればエラー・メッセージを返せるようなインターフェイスが欲しいところだ。利用者認証Webメソッドの戻り値にエラー・メッセージを設定してもよいが、ほかの機能との絡みを考えて出力(ByRef)パラメータとしてエラー・メッセージを定義し、Webメソッドの戻り値は認証に成功したか失敗したかを返すBoolean型としたい。

 今回は、TDDの流れに沿って実装を行うので、まずは、戻り値は常にFalseを返す形でここまでのコードを作成する。App_Coce/Auth.vbファイルを開いて、Authクラス内に次のコードのWebメソッド(IsLoginメソッド)を追記する。

''' <summary>
''' IDとパスワードを使ってDB認証を行い、結果を返却
''' </summary>
''' <param name="userID">ユーザーID</param>
''' <param name="password">パスワード</param>
''' <param name="errorMessage">エラー・メッセージ</param>
''' <returns>True:認証成功、False:認証失敗</returns>
<WebMethod(Description:="IDとパスワードを使ってDB認証を行い、結果を返却")> _
Public Function IsLogin( _
    ByVal userID As String, _
    ByVal password As String, _
    ByRef errorMessage As String) As Boolean

  Dim isOK As Boolean = False

  Return isOK

End Function
Auth.vbファイルに記述(ユーザーIDとパスワードでDB認証を行う利用者認証WebメソッドIsLoginの追記)

 DB認証の部分(Authサービスの実装)はひとまずこれで完了として、次にDBアクセスを行うDbAccessServiceサービスを実装していこう。ここでは単純にDBにアクセスして、EMPNO(=従業員番号)に合致するデータを検索するWebメソッド(以下、データ検索Webメソッド)を作成する。

(2)データ検索Webメソッドの考察

 データ検索Webメソッドでは、利用者認証Webメソッドと同じDB認証の考慮点に加えて、データ検索用のキー値と取得したデータの返却について考える必要がある。利用者認証Webメソッドのときに決めた方針に沿うならば、検索キー(この例ではEMPNO)は入力パラメータ、データ返却はWebメソッドの戻り値が妥当だろう。データ返却はいろいろなアプローチがあるが、データセット(=DataSetオブジェクト)を設定して返却することにする。

 具体的には、App_Coce/DbAccessService.vbファイルのDbAccessServiceクラス内に次のコード(GetRecordsメソッド)を記述する。なお、メソッドの仕様として、EMPNOにNothingが設定されたときは、全従業員のデータを返却する。

''' <summary>
''' EMPNOに一致した従業員情報を返却
''' </summary>
''' <param name="userID">ユーザーID</param>
''' <param name="password">パスワード</param>
''' <param name="errorMessage">エラー・メッセージ</param>
''' <param name="empno">EMPNO</param>
''' <returns>従業員情報(Nothingあり)</returns>
<WebMethod(Description:="EMPNOに一致した従業員情報を返却")> _
Public Function GetRecords( _
    ByVal userID As String, _
    ByVal password As String, _
    ByRef errorMessage As String, _
    ByVal empno As String) As System.Data.DataSet

  Dim Ds As New System.Data.DataSet

  Return Ds

End Function
DbAccessService.vbファイルに記述(従業員番号に合致するデータを検索するデータ検索WebメソッドGetRecordsの追記)

 さらに、DBにアクセスして、従業員番号に合致するデータを更新するWebメソッド(以下、データ更新Webメソッド)を作成する。

(3)データ更新Webメソッドの考察

 データ更新Webメソッドでは、利用者認証Webメソッドの考慮点に加えて、データ更新用のキー値と更新データの受け渡しについて考える必要がある。キー値(この例ではEMPNO)と更新データはパラメータとして定義し、更新成功ならばTrue、更新失敗ならばFalseを戻り値として返却する。

 以上を実装すると、次のコード(SetRecordsメソッド)のようになる。

''' <summary>
''' EMPNOに一致した従業員情報を更新
''' </summary>
''' <param name="userID">ユーザーID</param>
''' <param name="password">パスワード</param>
''' <param name="errorMessage">エラー・メッセージ</param>
''' <param name="empno">データを取得したときのEMPNO</param>
''' <param name="ds">従業員情報</param>
''' <returns>True:更新成功、False:更新失敗</returns>
''' <remarks>EMPNOが変わっていることも考慮して、検索キーをパラメータ設定</remarks>
<WebMethod(Description:="EMPNOに一致した従業員情報を更新")> _
Public Function SetRecords( _
    ByVal userID As String, _
    ByVal password As String, _
    ByRef errorMessage As String, _
    ByVal empno As String, _
    ByVal ds As System.Data.DataSet) As Boolean

  Dim isOK As Boolean = False

  Return isOK

End Function
DbAccessService.vbファイルに記述(従業員番号に合致するデータを更新するデータ更新WebメソッドSetRecordsの追記)

テスト・プロジェクトを作成する

 各Webメソッドのパラメータなどが決まったのでテスト・プロジェクトを作成する。今回は、単体テストのクラスを1つ作成する。これには、メニュー・バーから[テスト]−[新しいテスト]を選択して、表示される[新しいテストの追加]ダイアログで[テンプレート]から「単体テスト」を選択し、[名前]に任意の単体テスト名(今回は「DbAccessServiceTest.vb」)を入力して、[OK]ボタンをクリックすればよい。自動生成された.vbファイルにはTestMethod1メソッドが存在しているので削除しておく。

 さらに、AuthサービスとDbAccessServiceサービスへのWeb参照を追加しておく。[Web 参照名]は、順に「TestAuth」「TestDbAccessService」とした。

 作成したDbAccessServiceTest.vbファイルにテスト・コードを記述していくわけだが、今回のテスト・ケースとしては、次の8ケースが考えられる。それぞれTestメソッドとして定義する。

  • 正しいIDとパスワードで認証が成功
  • 誤ったパスワードで認証が失敗してエラー・メッセージ値を返却
  • 誤ったパスワードを指定して検索したときに認証失敗
  • 挿入したテスト・データをEMPNO(=EMPNO)指定でレコード取得
  • 存在しないEMPNOを指定したときにレコードが取得できない
  • 誤ったパスワードを指定して更新したときに認証失敗
  • 存在するEMPNOを指定してレコードを更新
  • 存在しないEMPNOを指定してレコード追加

 以上のテスト・ケースを忠実に実装したテスト・コード(DbAccessServiceTest.vbファイル)はこちらからダウンロードできる。すべてのテスト・コード説明は割愛する(ちなみに、テスト・コードではOracle.DataAccess.Client名前空間のクラスが使われているが、これはOracle Databaseにアクセスするためのものである。詳しくは後述)。ここでは1番目のテスト・ケースを実装したTestメソッドのみを提示しておく。

<TestMethod()> _
Public Sub 正しいIDとパスワードで認証が成功()
  Using webs As New TestAuth.Auth
    Dim errorMessage As String = Nothing
    Assert.IsTrue(webs.IsLogin("scott", "tiger", errorMessage), _
      "認証成功CHECK")
    Assert.IsNotNull(errorMessage, _
      "エラー・メッセージ初期化CHECK")
    Assert.AreEqual("", errorMessage, _
      "エラー・メッセージ空文字CHECK")
  End Using
End Sub
「正しいIDとパスワードで認証が成功」を検証するTestメソッド(DbAccessServiceTest.vbファイルより抜粋)

 テスト・コードの実装が完了したら、単体テストを実行してみよう。XML Webサービスの中身がないので、当然、そのテスト結果はすべて失敗になる。

図11 テスト結果がエラーのところからスタート

 次に、テストが成功するようにXML Webサービスを作成していこう。


 INDEX
  [特集]効率的なデータベース開発の実践
  DBアクセス用のXML Webサービスとは?
    1.DBアクセス用のXML Webサービス
    2.XML Webサービスの作成
    3.XML Webサービスの単体テストの実行
  4.XML WebサービスのWebメソッドへのパラメータの考察
    5.DBアクセスXML Webサービスを作成する
    6.DBアクセスXML Webサービスを使ってみる


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH