如何:在 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 類別的參考。
在 [方案總管] 中,選取 [顯示所有檔案] 工具列按鈕。
開啟 [伺服器] 節點的捷徑功能表,然後選擇 [加入參考]。
在 [參考管理員] 對話方塊中,展開 [組件] 節點,選取 [Framework] 節點,然後選取 [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。
注意事項 您可以用描述名稱符合您的預存程序。
在 [螢幕設計工具] 中,開啟按鈕節點的捷徑功能表,然後選擇 [編輯執行程式碼]。
將類似於下列範例的程式碼:
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); }