レッスン 2 : Web サービスから返される ADO.NET データセット用のレポート データセットの定義
新規 : 2006 年 7 月 17 日
このレッスンでは、XML の System.Data.DataSet オブジェクトを返す Web サービスへのデータ ソース接続を作成します。XML の System.Data.DataSet オブジェクトを返す Web サービスを作成して配置することも、利用可能な既存の Web サービスを使用することもできます。さらに、クエリ文字列を定義して、Web サービスによって返される XML の System.Data.DataSet からレポート データセット用に取得するデータを指定します。
このチュートリアルの Web サービスでは、AdventureWorks サンプル データベースのストアド プロシージャ uspGetEmployeeManagers を呼び出して、従業員と管理者の情報を取得します。このストアド プロシージャは、EmployeeID の値を受け取り、トップレベルの従業員に対して再帰的に従業員 - 管理者の関係を示す結果セットを生成するものです。
手順
ADO.NET データセットを返す Web サービスを作成するには (省略可)
Microsoft Visual Studio で、[ファイル] メニューの [新規作成] をクリックし、[Web サイト] をクリックします。
[新しいWeb サイト] ダイアログ ボックスが表示されます。
メモ : オプションに [Web サイト] が表示されない場合は、「チュートリアル : レポートでの XML データの使用」で必要条件を確認してください。 [テンプレート] ペインで、[ASP.NET Web Service] を選択します。
[場所] の一覧で、[HTTP] を選択します。
[言語] の一覧で、[Visual Basic] または [C#] を選択します。
[参照] ボタンをクリックします。
[場所の選択] ダイアログ ボックスが表示されます。
[Web サイトを開く] ペインで、[Local IIS] ボタンが選択されていることを確認します。
Web サイトのツリー コントロールで、この新しい Web サイトの親フォルダに移動します。
[新しい Web アプリケーションの作成] ボタンをクリックします。
Web サイトの名前を入力します。
[開く] をクリックします。
[OK] をクリックします。
Visual Studio 内に、手順 4. で選択したプログラミング言語の [App_Code/Service] コード ページが開かれ、サンプル WebMethod HelloWorld が表示されます。
メモ : 既定の名前空間は http://tempuri.org/
です。この名前空間は、以下でレポート データセットを定義するときにクエリ内で使用します。この既定値を変更する場合は、クエリを変更する必要があります。Visual Basic または C# のソース ファイルの先頭に、次の 2 つの名前空間参照を追加します。
using System.Data; using System.Data.SqlClient;
Imports System.Data Imports System.Data.SqlClient
Web メソッド HelloWorld を、次の Visual Basic または C# のコードに置き換えます。
[WebMethod] public DataSet GetEmployeeManagers(String EmployeeID) { Int32 val = Int32.Parse(EmployeeID); DataSet ds = new DataSet("Results"); try { if (val < 1) val = 1; else if (val > 290) val = 290; SqlDataAdapter da = new SqlDataAdapter(@"uspGetEmployeeManagers " + val.ToString(), @"Data Source=localhost; Initial Catalog=AdventureWorks; " + @"Integrated Security=true"); da.Fill(ds); } catch (Exception e) { throw; } return ds; }
<WebMethod()> _ Public Function GetEmployeeManagers(ByVal EmployeeID As String) As DataSet Dim ds As DataSet = New DataSet("Results") Try Dim val As Integer = Integer.Parse(EmployeeID) If (val < 1) Then val = 1 ElseIf (val > 290) Then val = 290 End If Dim da As SqlDataAdapter = _ New SqlDataAdapter("uspGetEmployeeManagers " + _ val.ToString(), _ "Data Source=localhost; Initial Catalog=AdventureWorks; " + _ "Integrated Security=true") da.Fill(ds) Catch e As Exception Throw End Try Return ds End Function
[ビルド] メニューの [Web サイトのビルド] をクリックします。
[ビルド] メニューの [Web サイトの発行] をクリックします。
パブリッシュした Web サービスをテストするには (省略可)
Internet Explorer を開きます。
[アドレス] バーに、Web サービスの URL を入力します。
たとえば、「https://localhost/XMLTutorial/Service.asmx」と入力します。
Web サービスの既定のページが表示されます。
[GetEmployeeManagersFromAdventureWorks] をクリックします。
EmployeeID の値として、1 ~ 290 の範囲の値を入力します。
[呼び出し] をクリックします。
Web サービスによってストアド プロシージャ uspGetEmployeeManagers が呼び出され、AdventureWorks データベースから従業員 - 管理者のデータセットが取得されます。
メモ : |
---|
"オブジェクトに対する実行のアクセス許可が拒否されました" というメッセージが表示された場合は、以下の手順に従い、ASPNETUser に対して AdventureWorks ストアド プロシージャの実行権限を与える必要があります。 |
ストアド プロシージャの実行権限を与えるには (省略可)
Microsoft SQL Server Management Studio を開きます。
サンプル データベース AdventureWorks がインストールされているデータベース エンジンに接続します。
オブジェクト エクスプローラで、[データベース] ノード、[AdventureWorks] ノード、[プログラミング]ノード、[ストアド プロシージャ] ノードの順に展開します。
dbo.uspGetEmployeeManagers を右クリックし、[プロパティ] をクリックします。
[ページの選択] ペインで [権限] をクリックします。
[ユーザーまたはロール] ペインで [追加] をクリックします。
[参照] ボタンをクリックし、[ASPNETUser] を選択します。
[OK] をクリックします。
これで、ASP.NET を実行する任意のユーザーに対し、uspGetEmployeeManagers ストアド プロシージャの実行権限を追加できました。
Web サービスのレポート データセットを定義するには
レポート デザイナを起動し、このチュートリアル用に作成したレポート サーバー プロジェクトを開きます。
[データ] ビューで、[新しいデータセット] を選択し、データセットの名前を入力します (たとえば「XMLWebDataSet」)。
[データセット] ダイアログ ボックスの [データ ソース] で、[新しいデータ ソース] をクリックします。[データ ソース] ダイアログ ボックスが表示されます。
データ ソースの名前を入力します (たとえば「XMLWebDataSource」)。
[型] で、[XML] をクリックします。
[接続文字列] で、レポート サーバー Web サービスを指す次の URL を入力します。
https://localhost/XMLTutorial/Service.asmx
[資格情報] タブで、[Windows 認証 (統合セキュリティ) を使用する] をクリックします。
[OK] をクリックして、変更を保存し、[データ ソース] ダイアログ ボックスを閉じます。
[レポート] メニューの [レポート パラメータ] をクリックします。[レポート パラメータ] ダイアログ ボックスが表示されます。
[追加] をクリックします。
[プロパティ] セクションの [名前] ボックスに、「EmployeeID」と入力します。
[表示名] ボックスに「Employee ID」と入力します。
[OK] をクリックします。
[データ] タブで、ツール バーの [選択したデータセットの編集] ([…]) ボタンをクリックします。[データセット] ダイアログ ボックスが表示されます。
[パラメータ] タブをクリックします。
[名前] 列に「EmployeeID」と入力します。
[値] ボックス内をクリックして一覧を選択できるようにし、[=Parameters!EmployeeID.Value] を選択します。これで、データセット パラメータがレポート パラメータにマップされます。
[OK] をクリックします。
[データセット] ダイアログ ボックスで、手順 1. で確認した名前空間のバージョン情報を使用して、次のクエリを入力します。
<Query> <SoapAction> http://tempuri.org/GetEmployeeManagers </SoapAction> <Method Namespace="http://tempuri.org/" Name="GetEmployeeManagers"> </Method> </Query>
ツール バーの [実行] ([!]) ボタンをクリックします。[クエリ パラメータの定義] ダイアログ ボックスが表示されます。
[パラメータ値] 列に、1 ~ 290 の範囲の EmployeeID 番号を入力します。
[OK] をクリックします。データセットが [データセット] ウィンドウに追加されます。
結果セットを確認します。クエリを実行すると、既定ではすべての XML 要素および属性から、データセット内で見つかった最初の XML パス上にあるリーフ ノードまでのデータが抽出されます。
クエリ ペインで、<Query> タグの直後に次の ElementPath を貼り付けます。
<ElementPath IgnoreNamespaces="True"> GetEmployeeManagersResponse {}/ GetEmployeeManagersResult/diffgram{}/ Results {}/Table </ElementPath>
これによってクエリに要素パスが指定され、結果セットにデータを取得する際、どの要素を使用するかが決まります。この場合、GetEmployeeManagersResponse、GetEmployeeManagersResult、diffgram、および Results ノードの後に空のかっこ ({}) が付いているので、クエリではこれらのデータがすべてスキップされます。Table ノードにはかっこが付いていないので、クエリではそのすべてのノードと属性が取得されます。
メモ : データセットのフィールド コレクションに取得する Table 要素を指定するには、 Table {FirstName, LastName, EmployeeID, ManagerID, RecursionLevel}
のように Table 要素の後の中かっこ内に要素を列記します。[実行] ([!]) をクリックして、結果セットを表示します。ElementPath 要素に加えた変更によって、クエリで返される結果セットが変わります。
結果セットに問題がなければ、ツール バーの [フィールドの更新] () ボタンをクリックします。レポート定義が保存され、[データセットのレポート] ウィンドウのフィールドの表示が更新されて、使用するすべてのフィールドが表示されます。
次の手順
ここでは、Web サービスによって返される XML の System.Data.DataSet object から取得するレポート データセットを定義し、レポートを実行したときにそれぞれの XML テーブル要素とその属性が Web サービスから取得されるようにしました。次は、レポートに埋め込まれた XML から レポート データセットを作成します。「レッスン 3 : 埋め込み XML データからのレポート データセットの定義」を参照してください。
参照
概念
その他の技術情報
レポート データセットの定義 (XML データ)
データ ソースへの接続
レポートのデータセットの定義
レポート固有のデータ ソースを作成または編集する方法 (レポート デザイナ)
データセットを作成する方法 (レポート デザイナ)
レポート データセットのフィールドの操作
[データセット] ウィンドウでフィールドを追加、編集、削除する方法 (レポート デザイナ)
[データセットのレポート] (レポート デザイナ)