最終更新日 2005 年 11 月 14 日

このコンテンツのポイント

  • Windows アプリケーションから Web サービスの利用方法について理解する。

今回紹介するコード

<Service.vb>

Visual Basic
<WebMethod()> _
Public Function GetDepartments()As DsAdv
    Dim ds As New DsAdv()
    Dim adapter As New DsAdvTableAdapters.DepartmentTableAdapter()
    adapter.Fill(ds.Department)
    Return ds
End Function
 

<Form1.vb>

Visual Basic
Private Sub Form1_Load(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) Handles MyBase.Load
    Dim srv As New localhost.Service()
    DepartmentBindingSource.DataSource = srv.GetDepartments()
    DepartmentBindingSource.DataMember = "Department"
End Sub
 

今回のシステム要件

  • Visual Studio 2005 Beta 2
  • IIS (インターネット インフォメーション サービス) 5.x または 6.0
  • SQL Server 2005 Express Edition (Visual Studio 2005 に付属のもの)
  • 任意のサンプル データベース (任意の一つのテーブルがあること)

目次

はじめに
作成するアプリケーションの概要
Web サービスの作成
Web サービス クライアントの作成
動作と解説
おわりに

C# の内容はこちらに掲載しています。
10 行でズバリ!! Windows アプリケーションからの Web サービスの利用 (C#)

 


はじめに

ビジネスロジックを Web サービス として実装することで、Windows フォームや Web フォーム、Office アプリケーションなどの様々なクライアント アプリケーションから、サーバー サイドのビジネスロジックを共有することが可能になります。

いわば、マルチクライアントの実現が Web サービスによって可能になります。

ここでは、簡単な Web サービスの作成と、それを利用する Windows アプリケーションの作成を通じて、Web サービスの作成や利用が Visual Studio 2005 によって容易に実現できることを見ていきます。

また、ここで作成した Web サービスは、「 10 行でズバリ !! Office アプリケーションからの Web サービスの利用 (VB)」や「 10 行でズバリ !! Web アプリケーションからの Web サービスの利用 (VB)」でも利用し、様々なクライアントから、同じ Web サービスを利用できることを確認します。

作成するアプリケーションの概要

ここでは、Web サービス側でデータ ベースにアクセスし、データセットをクライアント側に返す Web メソッドを作成します。また、データセットを受け取るクライアントを Windows フォーム アプリケーションとして作成します。このサンプルでは、SQL Server Express を使ってSQL Server 2005 のサンプル データベースである AdventureWorks を利用しますが、ADO.NET を経由して一つのテーブルを照会することができるのであれば、データベースは特に問いません。

Web サービスの作成

まず、新規にWebサイトを作成します。Visual Studio 2005 の [ファイル] メニューをクリックし、[新規作成] をポイントして、[Web サイト]をクリックします。 すると、[新しい Web サイト] ダイアログボックスが表示されます。

ここでは、[言語] ドロップダウンリストから Visual Basic を選択し、テンプレートとして 「ASP.NET Web サービス」 を選択します。 [場所] 欄では、ドロップダウン リストで 「HTTP」を選択します。アドレスとして、任意の仮想ディレクトリ名を指定します (たとえば、 「http://localhost/WebSrvDB」 など)。(図 1)

Visual Studio 2005 では、あらかじめローカル ディスクにWeb サービスを作成し、後から IIS 上に配置することもできますが、ここでは手順を簡単にするため、直接 IIS 上に作成します。そのため、[場所] 欄のドロップダウン リストでは、「HTTP」を選択する点に注意してください。今回は、複数のクライアントから利用するので、IIS 上で Web サービスを実行することにします。

設定が済んだら、[OK] をクリックします。Web サービス用の Web サイトが作成されます。

図 1. ASP.NET Web サービスの Web サイトを新規に作成する

次に、この Web サービスがデータベースにアクセスする上で使用する DataSet と TableAdapter を作成します。(DataSet とTableAdapter を含む ADO.NET の基本事項については、「10 行でズバリ !! ADO.NET と Visual Studio 2005 によるデータアクセス入門」も併せて参照してください。)

ソリューション エクスプローラ上の App_Code ノードを右クリックして、[新しい項目の追加] をクリックします。(通常、Web サービス関連のソース コードは、App_Code フォルダに追加するため、ここでは App_Code フォルダを明示的に右クリックして、追加を行います。)

[新しい項目の追加] ダイアログ ボックスが表示されるので、テンプレートとして「データセット」を選択し、[名前] ボックスには、「DsAdv.xsd」と入力します。(図 2) 設定が済んだら、[追加] をクリックします。

図 2. データセットを追加する

すると、TableAdapter 構成ウィザードが起動します。 (図 3)

図 3. データセットの追加によって、TableAdapter 構成ウィザードが起動する

ここで、[新しい接続] ボタンをクリックします。すると、[接続の追加] ダイアログ ボックスが表示されるので(図 4)、利用可能なデータベースを選択します。

図 4. 接続を指定する

ここでは、プログラム実行時にAdventureWorks のデータベース ファイルをSQL Server Express へアタッチすることにします。AdventureWorks データベース ファイルは、あらかじめ SQL Server 2005 からデタッチして、C:\Test\ に置いておきます。図 4 のように、[データ ソース] 欄では「SQL Server データベース ファイル」を指定し、[データベース ファイル名] 欄では「C:\Test\AdventureWorks_Data.mdf」と指定します。[Windows 認証を使用する] オプションを選択して、[OK] をクリックします。

図 3 に戻るので、[次へ] ボタンをクリックします。前述のように、データベース ファイルを指定した場合、プロジェクト内にコピーするか問い合わせが表示されるので (図 5) 、[いいえ] をクリックします。

図 5. プロジェクト内にコピーするか問い合わせが表示される

次に、データベースにアクセスするための接続文字列を、アプリケーション構成ファイル (Web.config) に保存するか問い合わせが表示されます (図 6)。Visual Studio 2005 では、接続文字列はソース コードに書かずに、アプリケーション構成ファイルに切り分けることが可能です。これによって、アプリケーションの運用時に後から接続先を変えるとき、コード修正や再コンパイルをせずに、構成ファイルを変更するだけで済みます。[次の名前で接続を保存する] チェックボックスをチェックしたままにして、[次へ] をクリックします。

図 6. 接続文字列は、アプリケーション構成ファイルに保存できる

次に、コマンドの種類を選択する画面 (図 7) では、[SQL ステートメントを使用する] オプションを選択したままにして、[次へ] をクリックします。

図 7. データアクセスに使用するコマンドの種類を指定する

次の画面 (図 8) では、データアクセスに使用する具体的なステートメントを指定します。ここでは、次の SELECT 文を入力します。

SELECT DepartmentID, Name, GroupName FROM HumanResources.Department

 

図 8. SELECT 文を指定する

注意: ここで指定する SQL 文は、テーブルを返すものであれば、特に問いません。ただし、このサンプルでは簡単にするため、テーブル全体をデータセットにロードするので、あまり件数 が多いテーブルを使用すると、パフォーマンスに影響します。AdventureWorks サンプル データベースでは、テーブルによっては 1万件以上のデータを持つものもあるので、注意してください。

SQL 文の指定が済んだら、[次へ] をクリックします。TableAdapter 内に生成するメソッドを指定する画面になるので (図 9)、既定のままにして、[次へ] をクリックします。

図 9. TableAdapter のメソッドを指定できる

最後に処理完了の画面が表示されるので (図 10)、[完了] をクリックします。

図 10. ウィザードの実行結果が表示される

ウィザードが完了すると、DsAdv.xsd のデータセット デザイナが開いています。(図 11) このデザイナの状態から、今回のデータセットには、Department テーブルが含まれていることが読み取れます。また、DepartmentTableAdapter という名前の TableAdapter が作成されたことが分ります。このデザイナは、これ以上使用しないので、閉じておきます。

図 11. データセット デザイナが開く

また、ソリューション エクスプローラの App_Code フォルダには、DsAdv.xsd ファイルが追加されていることが分ります。(図 12)この DsAdv.xsd ファイルを元に、ASP.NET は動的にDataSet や TableAdapter を生成します。この時点では、DataSet や TableAdapter のソースコードは存在していませんが、Visual Studio からは、これらクラスを参照することができます。

図 12. .xsd ファイルが App_Code フォルダに追加される

これで、DataSet と TableAdapter の準備ができました。

ここで、Service.vb のコード エディタに切り替えます。(既にエディタを閉じている場合、ソリューション エクスプローラ上の App_Code フォルダにある Service.vb をダブルクリックして、開いてください。)

既存の HelloWorld メソッドを削除し、以下のメソッドを追加します。

Visual Basic
<WebMethod()> _
Public Function GetDepartments()As DsAdv
    Dim ds As New DsAdv()
    Dim adapter As New DsAdvTableAdapters.DepartmentTableAdapter()
    adapter.Fill(ds.Department)
    Return ds
End Function
 

このメソッドでは、DataSet である DsAdv オブジェクト (変数ds) と、TableAdapter である DepartmentTableAdapter オブジェクト (変数 adapter) のインスタンスを作り、TableDapter の Fill メソッドを呼び出して、テーブル データを DsAdv オブジェクトの Department テーブルに読み込んでいます。そして、最後に DsAdv オブジェクトを戻り値として返しています。

コードの記述が完了したら、 [ビルド] メニューの [ソリューションのビルド] をクリックして、コンパイル エラーがないか確認しておきます。

ここで、Web サービスの動作を確認します。ソリューション エクスプローラ上の Service.asmx を右クリックし、[ブラウザで表示] をクリックします。

Web サービスの説明ページが開くので、[GetDepartments] リンクをクリックして、メソッドのテスト ページを開きます。

テスト ページで [起動] ボタンを押して、Web サービスのメソッドを呼び出します。以下のように、XML データとして、Department テーブルを含むデータセットが返ることを確認します。(図 13)

図 13. データセットが XML データとして返る

Web サービス クライアントの作成

ここでは、Web サービス クライアント として、 Windows フォーム アプリケーションを作成します。

もう一つ、Visual Studio 2005 を起動して、新規にプロジェクトを作成します。([ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。) ここでは、言語として Visual Basic を選択し、プロジェクト ペインでは、 [Windows アプリケーション] テンプレートを選択します。[プロジェクト名] ボックスに任意の名称を入力し(ここでは WinClientVB)、[場所] ボックスに適当なパスを入力して、[OK] ボタンをクリックします。(図 14)

これで Windows フォームによるクライアント アプリケーション開発の準備が完了しました。

図 14. Windows アプリケーション プロジェクトを新規に作成する

クライアント アプリケーションから Web サービスにアクセスするコードを実装する方法として、「Web 参照の追加」 をメニューから行う方法のほかに、[データ ソース] ウィンドウから行うこともできます。ここでは、[データ ソース] ウィンドウをを使用します。

まず、[データ] メニューの [データ ソースの表示] をクリックして、[データ ソース] ウィンドウを表示します。(図 15)

図 15. [データ ソース] ウィンドウ

[データ ソース] ウィンドウの左端にある [新しいデータ ソースの追加] ボタンをクリックします。(ボタンの名称は、マウスポインタをボタンの上に移動することで、ツールヒントとして表示されます。) すると、データ ソース構成ウィザードが起動します。(図 16) ここでは、Web サービスを選択して、[次へ] をクリックします。

図 16. データ ソース構成ウィザード

Web 参照の追加を行う画面になる (図 17) ので、次のアドレスを指定して、[移動] ボタンを押します。

http://localhost/WebSrvDB/Service.asmx?wsdl

 

図 17. Web 参照の追加を行う

Web サービスに問題なくアクセスできたら、[Web 参照の追加] ボタンをクリックします。

Web 参照の追加が完了したことがウィザードに表示されるので (図 18)、[完了] ボタンを押してウィザードを終了します。

図 18. Web 参照の追加が完了する

この操作によって、Web サービスにアクセスするプロキシ クラスが生成されます。また、この Web サービスはデータセット DsAdv を返すので、クライアント側にも受け皿となる DsAdv クラスのソース コードが生成されます。(これらのソースコードのファイルは、既定の設定では、ソリューション エスクプローラに表示されません。ソリューション エクスプローラの上部にある [すべてのファイルを表示] ボタンを押すことで、表示できます。ソース ファイルは、[Web References] ノードから [localhost]、[Reference.map] と展開したノードの下の、Reference.vb というファイルの中に記述されています。)

データセットが生成されると、[データ ソース] ウィンドウには、そのデータセットのデータ構造が表示されます。(図 19)

図 19. [データ ソース] ウィンドウに Web サービスの戻り値のデータセットが表示される

この [データ ソース] ウィンドウを使用すると、Web サービスの戻り値として返されるデータセットと連結する、ユーザー インターフェイスを簡単に作成することができます。

ここで、Form1.vb の Windows フォーム デザイナを開き、[データ ソース] ウィンドウの Department テーブル ノードを、フォーム デザイナ上にドラッグ アンド ドロップします。すると、フォーム上には Department テーブルを表示するユーザー インターフェイスが自動的に生成されます。(図 20)

図 20. データセット内の Departmentテーブルと連結したユーザー インターフェイスが生成される

これで、データセットと連結する部分は完成しました。後は、Web サービスにアクセスして、データセットをクライアントに取り込む部分を作成します。

Form1.vb のデザイナ上の、フォームの余白部分をダブルクリックして、Form1_Load イベント ハンドラを生成します。このイベント ハンドラに以下のコードを入力します。

Visual Basic
Private Sub Form1_Load(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) Handles MyBase.Load
    Dim srv As New localhost.Service()
    DepartmentBindingSource.DataSource = srv.GetDepartments()
    DepartmentBindingSource.DataMember = "Department"
End Sub
 

このコードでは、プロキシ クラスである Service クラスのインスタンスを作り、GetDepartments メソッドを呼び出して、DsAdv データセットを取得しています。

取得したデータセットは、departmentBindingSource オブジェクトの DataSource プロパティに設定しています。このオブジェクトは、フォーム デザイナに Department テーブルをドラッグ アンド ドロップした際に生成されたもので、BindingSource クラスのインスタンスです。BindingSource はデータを提供するオブジェクトで、カレント レコードを管理することができます。画面上の DataGridView と直接的に連結しているのは、このオブジェクトです。(BindingSource については、 10 行でズバリ !! カーソルコントロール (VB) を参照してください。)

動作と解説

ここで、クライアント アプリケーションを実行してみます。[Ctrl] +[ F5] キーを押すか、[デバッグ] メニューの [デバッグなしで開始] をクリックします。

フォームが開き、Web サービスから取得したデータセットが DataGridView に表示されることが分ります。(図 21)

図 21. Web サービスから取得したデータセットが表示される

おわりに

このように、Web サービスの実装やクライアントの実装は、Visual Studio の様々なウィザードやデザイナを使うことで、効率よく作成できることができます。典型的なデータセットのやり取りは、数行のコードを記述するだけで、実現することができます。

このような Web サービスを利用するクライアントは、Office アプリケーションや Web アプリケーションとして作成することもできます。これらの様々なクライアント アプリケーションの開発は、Visual Studio 2005 を使用するとで、生産性を向上することができます。Office アプリケーションや Web アプリケーションを Web サービス クライアントとして構築する方法は、それぞれ、「 10 行でズバリ !! Office アプリケーションからの Web サービスの利用 (VB)」、「 10 行でズバリ !! Web アプリケーションからの Web サービスの利用 (VB)」を参照してください。


Code Recipe .NET Framework デベロッパー センター

ページのトップへ