Поделиться через


Практическое руководство. Выполнение хранимой процедуры в LightSwitch

Приложения LightSwitch могут выполнять хранимые процедуры в базе данных SQL Server, вызывая их с уровня сервера. Можно создавать команды на клиентском уровне для активации выполнения, а также задавать разрешения для управления доступом к хранимым процедурам.

Во многих существующих базах данных используются хранимые процедуры, поскольку они имеют преимущества над другими типами взаимодействия баз данных, в частности следующие: модульное программирование, ускоренное выполнение и менее интенсивный сетевой трафик. Эти же преимущества относятся к выполнению хранимых процедур из приложения LightSwitch.

В указанных ниже процедурах используется хранимая процедура uspUpdateEmployeePersonalInfo из примера базы данных AdventureWorks:

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. В окне Свойства в поле Имя введите UpdateEmployeePersonalInfoOperation.

      Примечание

      Обычно UpdateEmployeePersonalInfoOperation заменяется именем хранимой процедуры, которую требуется выполнить, и идентификатором, например "Operation", чтобы указать, что эта таблица используется для хранимой процедуры.

    3. Добавьте в таблицу следующие поля:

      Имя

      Тип

      Обязательно

      КодСотрудника

      Целое число

      Да

      Национальный_идентификационный_номер

      Строковое

      Да

      Дата_рождения

      Дата/время

      Да

      Семейное_положение

      Строковое

      Да

      Пол

      Строковое

      Да

      Примечание

      В полях Имя и Тип замените значения именами и типами данных для каждого входного параметра в хранимой процедуре и обеспечьте маркировку всех полей в соответствии с требованиями.

  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, а затем — UpdateEmployeePersonalInfoOperation, используя ApplicationData только что созданного объекта DataWorkspace. Присваиваются значения для операции, и операция вызывается путем вызова метода 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

Основные понятия

Работа с объектами, связанными с данными, в коде