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

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

初音玲
2009/02/06

DBアクセスXML Webサービスを作成する

(1)ODP.NETの参照設定

 今回のDBにはOracle Database 11g Release 1を使用する。よって、ADO.NET相当のODP.NETを使ってプログラムを作成する。ODP.NETでは「Oracle.DataAccess」クラス・ライブラリを使うので、[ソリューション エクスプローラ]でプロジェクトを右クリックしてコンテキスト・メニューの[参照の追加]で参照設定を行う。

(2)利用者認証の実装

 まずはAuthサービスを完成させよう。IsLoginメソッドを次の太字部分のコードのように書き換える。

<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
  Dim cnString As String = String.Format( _
      "User Id={0};password={1};data source={2}", _
      userID, password, _
      ConfigurationManager.AppSettings("ConnectionString"))

  Using _cn As New OracleConnection
    Try
      _cn.ConnectionString = cnString
      _cn.Open()
      errorMessage = ""
      isOK = True
    Catch ex As Exception
      errorMessage = ex.Message
    End Try
  End Using
  Return isOK

End Function
ユーザーIDとパスワードでDB認証を行う利用者認証WebメソッドIsLoginの正式実装(Auth.vbファイル)
OracleConnectionクラスの名前空間をインポートするため、「Imports Oracle.DataAccess.Client」をファイルの先頭部分に記述する必要がある。

 OracleConnectionオブジェクト(_cn)に接続文字列を設定してOpenメソッドで接続している。接続先についてはWeb.Configの<AppSettings>要素内に、

<add key="ConnectionString" value="orcl.ora11g.dolis.dfjj.net"/>

を定義しており、この定義値を、

ConfigurationManager.AppSettings("ConnectionString")

というコードで取得している。

(3)参照の実装

 続いてDbAccessServiceサービスを実装しよう。データ検索Webメソッド(=GetRecordsメソッド)のコードは、次の太字部分のように書き換える。

<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
  Dim cnString As String = String.Format( _
    "User Id={0};password={1};data source={2}", _
    userID, password, _
    ConfigurationManager.AppSettings("ConnectionString"))
  Dim sqlString As String = "SELECT * FROM EMP WHERE EMPNO=:EMPNO"

  errorMessage = ""
  Using _cn As New OracleConnection
    Try
      _cn.ConnectionString = cnString
      _cn.Open()
      Using _cmd As New OracleCommand(sqlString, _cn)
        _cmd.Parameters.Add(New OracleParameter("EMPNO", empno))
        Using _da As New OracleDataAdapter(_cmd)
          _da.Fill(Ds, "EMP")
        End Using
      End Using
    Catch ex As Exception
      errorMessage = ex.Message
    Finally
      Try
        _cn.Close()
      Catch ex As Exception
      End Try
    End Try
  End Using
  Return Ds

End Function
従業員番号に合致するデータを検索するデータ検索WebメソッドGetRecordsの正式実装(DbAccessService.vbファイル)
OracleConnectionクラスの名前空間をインポートするため、「Imports Oracle.DataAccess.Client」をファイルの先頭部分に記述する必要がある。

 データアダプタ(=OracleDataAdapterオブジェクト)のFillメソッドでデータセット(=DataSetオブジェクト)を取得し、これを戻り値として返却している。

(4)更新の実装

 最後に、データ更新Webメソッド(=SetRecordsメソッド)のコードを、次の太字部分のように書き換える。

<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
  Dim cnString As String = String.Format( _
      "User Id={0};password={1};data source={2}", _
      userID, password, _
      ConfigurationManager.AppSettings("ConnectionString"))
  Dim sqlString As String = _
      "SELECT * FROM EMP WHERE EMPNO=:EMPNO"

  errorMessage = ""
  Try
    Using _cn As New OracleConnection(cnString)
      _cn.Open()
      Using _tr As OracleTransaction = _cn.BeginTransaction()
        Using _cmd As New OracleCommand(sqlString, _cn)
          _cmd.Transaction = _tr    '###重要###
          Using _da As New OracleDataAdapter(_cmd)
            Using cb As New OracleCommandBuilder(_da)
              _da.UpdateCommand = cb.GetUpdateCommand()
              _da.InsertCommand = cb.GetInsertCommand()
              _da.DeleteCommand = cb.GetDeleteCommand()
              Try
                _da.Update(ds, "EMP")
                isOK = True
              Catch ex As Exception
                errorMessage = ex.Message
              Finally
                If isOK Then
                  _tr.Commit()
                Else
                  _tr.Rollback()
                End If
              End Try
            End Using
          End Using
        End Using
      End Using
      _cn.Close()
    End Using
  Catch ex As Exception
    errorMessage = ex.Message
  End Try
  Return isOK

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

 OracleCommandBuilderオブジェクトでSELECT文からUPDATE文、INSERT文、DELETE文を生成して、データアダプタ(=OracleDataAdapterオブジェクト)のUpdateメソッドでOracle Databaseを更新している。

 では、もう一度単体テストを実行してみよう。すると、次の画面のようにすべて成功するはずだ。

図12 テスト成功

 以上のDBアクセスXML Webサービスの実装は完了だが、本稿の締めくくりとして、このWebサービスにアクセスする(クライアント側の)Windowsアプリケーションの実装方法を簡単に説明しておこう。


 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