如何:在 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. 解决方案资源管理器,打开 数据源 节点的快捷菜单,然后选择 添加表

    2. 属性 窗口,请在 名称 框中,输入 UpdateEmployeePersonalInfoUpdate。

      说明说明

      用要执行加一个标识符 (如“操作”表示存储过程的名称通常将替换 UpdateEmployeePersonalInfoOperation 此表用于存储过程使用。

    3. 以下字段添加到表:

      名称

      类型

      必需

      EmployeeID

      Integer

      NationalIDNumber

      字符串

      出生日期

      日期时间

      MaritalStatus

      字符串

      性别

      字符串

      说明说明

      名称类型 字段,请在名称和数据类型替换值每个输入参数的在存储过程,并确保所有字段被标记为"必需"。

  2. 添加对 ConfigurationManager 选件类。

    1. 解决方案资源管理器,选择 显示所有文件 工具栏按钮。

    2. 打开 服务器 节点的快捷菜单,然后选择 添加引用

    3. 引用管理器 对话框中,展开 程序集 节点,选择 框架 节点,然后选择 System.Configuration 复选框。

  3. 编写代码 列表中,选择 插入 方法 (在这种情况下,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
    
                Me.Details.DiscardChanges()
            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();
                }
            }
    
            this.Details.DiscardChanges();
        }
    }
    

    此代码将创建一 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 的 ApplicationData,此代码首先创建 DataWorkspace 然后创建 UpdateEmployeePersonalInfoOperation。操作的值赋,并且,操作通过调用 SaveChanges调用。此步骤触发在数据库中执行存储过程的中间层 UpdateEmployeePersonalInfoOperations_Inserting 方法。

    提示提示

    当您调用存储过程时,不会刷新屏幕数据反映更改。若要刷新屏幕,可以调用 Employees.Refresh() 或 DataWorkspace.AdventureWorksData.Employees_Single(operation.EmployeeID) 在按钮的 Execute 方法的末尾。请注意 Employees.Refresh() 刷新所有记录,并且,Employees_Single 刷新您指定的项目。

定义一个存储过程的权限

  1. 解决方案资源管理器,打开 属性 节点的快捷菜单,然后选择 打开

  2. 访问控制 选项,因此,如果尚未指定,选择要使用的身份验证类型。

  3. 选择 <Add New Permission> 该链接,然后输入 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);
    }
    

请参见

任务

演练:使用存储过程更新记录

LightSwitch 身份验证和授权

概念

在代码中使用与数据相关的对象