方法: LightSwitch でストアド プロシージャを実行する
LightSwitch アプリケーションは、SQL Server データベースのストアド プロシージャを、サーバー層から呼び出すことによって実行できます。 実行をトリガーするためのコマンドをクライアント層に作成したり、ストアド プロシージャにアクセスできるユーザーを制御するためのアクセス許可を定義したりすることができます。
ストアド プロシージャには、他の種類のデータベース操作方法にはない利点 (モジュール型プログラミング、実行の速さ、ネットワーク トラフィックの少なさなど) があるため、多くの既存のデータベースは、ストアド プロシージャを使用します。 このような利点は、LightSwitch アプリケーションからストアド プロシージャを実行する際にも利用できます。
以下の手順では、AdventureWorks サンプル データベースの uspUpdateEmployeePersonalInfo ストアド プロシージャを使用します。
CREATE PROCEDURE [HumanResources].[uspUpdateEmployeePersonalInfo]
@EmployeeID [int],
@NationalIDNumber [nvarchar](15),
@BirthDate [datetime],
@MaritalStatus [nchar](1),
@Gender [nchar](1)
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
UPDATE [HumanResources].[Employee]
SET [NationalIDNumber] = @NationalIDNumber
,[BirthDate] = @BirthDate
,[MaritalStatus] = @MaritalStatus
,[Gender] = @Gender
WHERE [EmployeeID] = @EmployeeID;
END;
別のストアド プロシージャを実行するには、それに合わせて名前とパラメーターを変更する必要があります。
ストアド プロシージャを実行するには
ストアド プロシージャの入力パラメーターを含むテーブルを、組み込みデータベース内に作成します。
ソリューション エクスプローラーで [Data Sources] ノードのショートカット メニューを開き、[テーブルの追加] を選択します。
[プロパティ] ウィンドウの [名前] ボックスに「UpdateEmployeePersonalInfoOperation」と入力します。
注意
通常は、UpdateEmployeePersonalInfoOperation を、実行するストアド プロシージャの名前に置き換えます。また、"Operation" のような識別子を、このテーブルがストアド プロシージャのために使用されることを示すように変更します。
テーブルに次のフィールドを追加します。
名前
種類
必須
EmployeeID
整数
○
NationalIDNumber
String
○
BirthDate
日付と時刻
○
MaritalStatus
String
○
性別
String
○
注意
[名前] および [型] フィールドで、値をストアド プロシージャの各入力パラメーターの名前とデータ型に置き換え、すべてのフィールドが必須としてマークされていることを確認します。
ConfigurationManager クラスへの参照を追加します。
ソリューション エクスプローラーで、[サーバー] ノードのショートカット メニューを開き、[参照の追加] を選択します。
[参照マネージャー] ダイアログ ボックスで [アセンブリ] ノードを展開し、[フレームワーク] ノードを選択して、[System.Configuration] チェック ボックスをオンにします。
[コードの記述] の一覧で [Inserting] メソッド (この場合は、UpdateEmployeePersonalInfoOperations_Inserting メソッド) を選択します。
次の例のようなコードを追加します。
Imports System.Configuration Imports System.Data Imports System.Data.SqlClient Namespace LightSwitchApplication Public Class ApplicationDataService Private Sub UpdateEmployeePersonalInfoOperations_Inserting(entity As UpdateEmployeePersonalInfoOperation) Using connection = New SqlConnection Dim connectionStringName = Me.DataWorkspace.AdventureWorksData.Details.Name connection.ConnectionString = ConfigurationManager.ConnectionStrings(connectionStringName).ConnectionString Dim procedure = "HumanResources.uspUpdateEmployeePersonalInfo" Using command = New SqlCommand(procedure, connection) command.CommandType = CommandType.StoredProcedure command.Parameters.Add( New SqlParameter("@EmployeeID", entity.EmployeeID)) command.Parameters.Add( New SqlParameter("@NationalIDNumber", entity.NationalIDNumber)) command.Parameters.Add( New SqlParameter("@BirthDate", entity.BirthDate)) command.Parameters.Add( New SqlParameter("@MaritalStatus", entity.MaritalStatus)) command.Parameters.Add( New SqlParameter("@Gender", entity.Gender)) connection.Open() command.ExecuteNonQuery() End Using End Using End Sub End Class End Namespace
using System.Configuration; using System.Data; using System.Data.SqlClient; public partial class ApplicationDataService { partial void UpdateEmployeePersonalInfoOperations_Inserting(UpdateEmployeePersonalInfoOperation entity) { using (SqlConnection connection = new SqlConnection()) { string connectionStringName = this.DataWorkspace.AdventureWorksData.Details.Name; connection.ConnectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; string procedure = "HumanResources.uspUpdateEmployeePersonalInfo"; using (SqlCommand command = new SqlCommand(procedure, connection)) { command.CommandType = CommandType.StoredProcedure; command.Parameters.Add( new SqlParameter("@EmployeeID", entity.EmployeeID)); command.Parameters.Add( new SqlParameter("@NationalIDNumber", entity.NationalIDNumber)); command.Parameters.Add( new SqlParameter("@BirthDate", entity.BirthDate)); command.Parameters.Add( new SqlParameter("@MaritalStatus", entity.MaritalStatus)); command.Parameters.Add( new SqlParameter("@Gender", entity.Gender)); connection.Open(); command.ExecuteNonQuery(); } } } }
このコードは、SqlConnection オブジェクトを作成し、web.config ファイルから接続文字列を取得します。 次に、コードは必要なコマンド テキストを含む SqlCommand オブジェクトを作成し、パラメーター値を追加して、コマンドを実行します。 最後に、DiscardChanges が呼び出されます。UpdateEmployeePersonalInfoOperation テーブルの変更を保存する必要はありません。
注意
DataWorkspace の名前、パラメーター名、および値を、独自のストアド プロシージャのものに置き換える必要があります。
画面からストアド プロシージャを呼び出すには
画面デザイナーで [画面コマンド バー] ノードのショートカット メニューを開き、[ボタンの追加] を選択します。
[ボタンの追加] ダイアログ ボックスで、[新しいメソッド] オプション ボタンを選択します。
[名前] ボックスに「UpdateEmployeeInfo」と入力します。
注意
ストアド プロシージャの機能を説明する名前に置き換えることができます。
画面デザイナーでボタン ノードのショートカット メニューを開き、[Execute コードの編集] を選択します。
次の例のようなコードを追加します。
Private Sub UpdateEmployeeInfo_Execute() Dim dataWorkspace = New DataWorkspace Dim employee = Me.Employees.SelectedItem Dim operation = dataWorkspace.ApplicationData.UpdateEmployeePersonalInfoOperations.AddNew() operation.EmployeeID = employee.EmployeeID operation.NationalIDNumber = employee.NationalIDNumber operation.BirthDate = employee.BirthDate operation.MaritalStatus = employee.MaritalStatus operation.Gender = employee.Gender dataWorkspace.ApplicationData.SaveChanges() End Sub
partial void UpdateEmployeeInfo_Execute() { DataWorkspace dataWorkspace = new DataWorkspace(); Employee employee = this.Employees.SelectedItem; UpdatePersonalInfoOperation operation = dataWorkspace.ApplicationData.UpdateEmployeePersonalInfoOperations.AddNew(); operation.EmployeeID = employee.EmployeeID; operation.NationalIDNumber = employee.NationalIDNumber; operation.BirthDate = employee.BirthDate; operation.MaritalStatus = employee.MaritalStatus; operation.Gender = employee.Gender; dataWorkspace.ApplicationData.SaveChanges(); }
このコードは、最初に DataWorkspace を作成し、新しく作成された DataWorkspace の ApplicationData を使用して、UpdateEmployeePersonalInfoOperation を作成します。 操作のための値が割り当てられ、SaveChanges の呼び出しによって操作が呼び出されます。 この手順では、データベースのストアド プロシージャを実行する、中間層の UpdateEmployeePersonalInfoOperations_Inserting メソッドがトリガーされます。
ヒント
ストアド プロシージャを呼び出す場合、変更を反映するための画面データの更新は行われません。画面を更新するには、ボタンの Employees.Refresh() メソッドの最後で DataWorkspace.AdventureWorksData.Employees_Single(operation.EmployeeID) か Execute を呼び出します。Employees.Refresh() はすべてのレコードを更新し、Employees_Single は指定された項目だけを更新することに注意してください。
ストアド プロシージャのアクセス許可を定義するには
ソリューション エクスプローラーで [プロパティ] ノードのショートカット メニューを表示し、[開く] を選択します。
[アクセス制御] タブで、使用する認証の種類を選択します (まだ指定されていない場合)。
[<新しいアクセス許可の追加>] リンクを選択し、「UpdatePersonalInfo」と入力します。
注意
ストアド プロシージャの機能を説明する名前に置き換えることができます。
ソリューション エクスプローラーで、ストアド プロシージャ テーブルのショートカット メニューを表示し、[開く] を選択します。
[コードの記述] の一覧で [CanInsert] メソッドを選択します。
次の例のようなコードを追加します。
Private Sub UpdateEmployeePersonalInfoOperations_CanInsert(ByRef result As Boolean) result = Me.Application.User.HasPermission(Permissions.UpdatePersonalInfo) End Sub
partial void UpdateEmployeePersonalInfoOperations_CanInsert(ref bool result) { result = this.Application.User.HasPermission(Permissions.UpdatePersonalInfo); }
参照
処理手順
方法: Silverlight クライアント アプリケーションで認証を有効にする