次の方法で共有


方法: 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;

別のストアド プロシージャを実行するには、それに合わせて名前とパラメーターを変更する必要があります。

ストアド プロシージャを実行するには

  1. ストアド プロシージャの入力パラメーターを含むテーブルを、組み込みデータベース内に作成します。

    1. ソリューション エクスプローラー[Data Sources] ノードのショートカット メニューを開き、[テーブルの追加] を選択します。

    2. [プロパティ] ウィンドウの [名前] ボックスに「UpdateEmployeePersonalInfoOperation」と入力します。

      注意

      通常は、UpdateEmployeePersonalInfoOperation を、実行するストアド プロシージャの名前に置き換えます。また、"Operation" のような識別子を、このテーブルがストアド プロシージャのために使用されることを示すように変更します。

    3. テーブルに次のフィールドを追加します。

      名前

      種類

      必須

      EmployeeID

      整数

      NationalIDNumber

      String

      BirthDate

      日付と時刻

      MaritalStatus

      String

      性別

      String

      注意

      [名前] および [型] フィールドで、値をストアド プロシージャの各入力パラメーターの名前とデータ型に置き換え、すべてのフィールドが必須としてマークされていることを確認します。

  2. ConfigurationManager クラスへの参照を追加します。

    1. ソリューション エクスプローラーで、[サーバー] ノードのショートカット メニューを開き、[参照の追加] を選択します。

    2. [参照マネージャー] ダイアログ ボックスで [アセンブリ] ノードを展開し、[フレームワーク] ノードを選択して、[System.Configuration] チェック ボックスをオンにします。

  3. [コードの記述] の一覧で [Inserting] メソッド (この場合は、UpdateEmployeePersonalInfoOperations_Inserting メソッド) を選択します。

  4. 次の例のようなコードを追加します。

    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 の名前、パラメーター名、および値を、独自のストアド プロシージャのものに置き換える必要があります。

画面からストアド プロシージャを呼び出すには

  1. 画面デザイナー[画面コマンド バー] ノードのショートカット メニューを開き、[ボタンの追加] を選択します。

  2. [ボタンの追加] ダイアログ ボックスで、[新しいメソッド] オプション ボタンを選択します。

  3. [名前] ボックスに「UpdateEmployeeInfo」と入力します。

    注意

    ストアド プロシージャの機能を説明する名前に置き換えることができます。

  4. 画面デザイナーでボタン ノードのショートカット メニューを開き、[Execute コードの編集] を選択します。

  5. 次の例のようなコードを追加します。

    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 は指定された項目だけを更新することに注意してください。

ストアド プロシージャのアクセス許可を定義するには

  1. ソリューション エクスプローラー[プロパティ] ノードのショートカット メニューを表示し、[開く] を選択します。

  2. [アクセス制御] タブで、使用する認証の種類を選択します (まだ指定されていない場合)。

  3. [<新しいアクセス許可の追加>] リンクを選択し、「UpdatePersonalInfo」と入力します。

    注意

    ストアド プロシージャの機能を説明する名前に置き換えることができます。

  4. ソリューション エクスプローラーで、ストアド プロシージャ テーブルのショートカット メニューを表示し、[開く] を選択します。

  5. [コードの記述] の一覧で [CanInsert] メソッドを選択します。

  6. 次の例のようなコードを追加します。

    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 クライアント アプリケーションで認証を有効にする

概念

コードでのデータ関連オブジェクトの操作