如何:在 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;
若要执行不同的存储过程,您必须更改名称和参数匹配它。
执行存储过程
创建表中包含存储过程的输入参数的内部数据库。
在 解决方案资源管理器,打开 数据源 节点的快捷菜单,然后选择 添加表。
在 属性 窗口,请在 名称 框中,输入 UpdateEmployeePersonalInfoUpdate。
说明
用要执行加一个标识符 (如“操作”表示存储过程的名称通常将替换 UpdateEmployeePersonalInfoOperation 此表用于存储过程使用。
以下字段添加到表:
名称
类型
必需
EmployeeID
Integer
是
NationalIDNumber
字符串
是
出生日期
日期时间
是
MaritalStatus
字符串
是
性别
字符串
是
说明
在 名称 和 类型 字段,请在名称和数据类型替换值每个输入参数的在存储过程,并确保所有字段被标记为"必需"。
添加对 ConfigurationManager 选件类。
在 解决方案资源管理器,选择 显示所有文件 工具栏按钮。
打开 服务器 节点的快捷菜单,然后选择 添加引用。
在 引用管理器 对话框中,展开 程序集 节点,选择 框架 节点,然后选择 System.Configuration 复选框。
在 编写代码 列表中,选择 插入 方法 (在这种情况下,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 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 名称和参数名和值您的存储过程的。
调用从屏幕上存储过程
在 屏幕设计器,打开 屏幕命令栏 节点的快捷菜单,然后选择 添加按钮。
在 添加按钮 对话框中,选择 新建方法 选项按钮。
在 名称 文本框中,输入 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 的 ApplicationData,此代码首先创建 DataWorkspace 然后创建 UpdateEmployeePersonalInfoOperation。操作的值赋,并且,操作通过调用 SaveChanges调用。此步骤触发在数据库中执行存储过程的中间层 UpdateEmployeePersonalInfoOperations_Inserting 方法。
提示
当您调用存储过程时,不会刷新屏幕数据反映更改。若要刷新屏幕,可以调用 Employees.Refresh() 或 DataWorkspace.AdventureWorksData.Employees_Single(operation.EmployeeID) 在按钮的 Execute 方法的末尾。请注意 Employees.Refresh() 刷新所有记录,并且,Employees_Single 刷新您指定的项目。
定义一个存储过程的权限
在 解决方案资源管理器,打开 属性 节点的快捷菜单,然后选择 打开。
在 访问控制 选项,因此,如果尚未指定,选择要使用的身份验证类型。
选择 <Add New Permission> 该链接,然后输入 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); }