With daEmployees.InsertCommand
.Connection = conn
.CommandType = CommandType.StoredProcedure.CommandText = "InsertEmployee"
End With
param = daEmployees.InsertCommand.Parameters.Add(_
New SqlParameter(@FirstName", SqlDbType.VarChar, 50))
param.Direction = ParameterDirection.Input
param.SourceColumn = "FirstName"
param.SourceVersion = DataRowVersion.Current
param = daEmployees.InsertCommand.Parameters.Add( _
New SqlParameter("@LastName", SqlDbType.VarChar, 70))
param.Direction = ParameterDirection.Input
param.SourceColumn = "LastName"
param.SourceVersion = DataRowVersion.Current
param = daEmployees.InsertCommand.Parameters.Add(_
New SqlParameter("@DepartmentID, SqlDbType.Int))
param.Direction = ParameterDirection.Input
param.SourceColumn = "DepartmentID"
param.SourceVersion = DataRowVersion.Current
param = daEmployees.InsertCommand.Parameters.Add( _
New SqlParameter("@Salary", SqlDbType.Money))
param.Direction = ParameterDirection.Input
param.SourceColumn = "Salary"
param.SourceVersion = DataRowVersion.Current
' Создание специализированной
' хранимой процедуры для команды Update.
daEmployees.UpdateCommand = New SqlCommand()
With daEmployees.UpdateCommand
.Connection = conn
.CommandType = CommandType.StoredProcedure
.CommandText = "UpdateEmployee"
End With
param = daEmployees.UpdateCommand.Parameters.Add( _
New SqlParameter("@FirstName@, SqlDbType.VarChar, 50))
param.Direction = ParameterDirection.Input
param.SourceColumn = "FirstName"
param.SourceVersion = DataRowVersion.Current
param = daEmployees.UpdateCommand.Parameters.Add( _
New qlParameter("@LastName", SqlDbType.VarChar, 70))
param.Direction = ParameterDirection.Input
param.SourceColumn = "LastName"
param.SourceVersion = DataRowVersion.Current
param = daEmployees.UpdateCommand.Parameters.Add( _
New SqlParameter("@DepartmentID, SqlDbType.Int))
param.Direction = ParameterDirection.Input
param.SourceColumn = "DepartmentID"
param.SourceVersion = DataRowVersion.Current
param = daEmployees.UpdateCommand.Parameters.Add( _
New SqlParameter("@Salary, SqlDbType.Money))
param.Direction = ParameterDirection.Input
param.SourceColumn = "Salary"
param.SourceVersion = DataRowVersion.Current
param = daEmployees.UpdateCommand.Parameters.Add( _
New SqlParameter("@Original_ID, SqlDbType.Int))
param.Direction = ParameterDirection.Input
param.SourceColumn = "ID"
param.SourceVersion = DataRowVersion.Original
' Создание специализированной
' хранимой процедуры для команды Delete.
daEmployees.DeleteCommand = New SqlCommand()
With daEmployees.DeleteCommand
.Connection = conn
.CommandType = CommandType.StoredProcedure
.CommandText = "DeleteEmployee"
End With
param = daEmployees.DeleteCommand.Parameters.Add(_
New SqlParameter("@Original_ID", SqlDbType.Int))
param.Direction = ParameterDirection.Input
param.SourceColumn = "ID"
param.SourceVersion = DataRowVersion.Original
End Sub
НА ЗАМЕТКУКод присвоения значений для каждого из объектов-параметров мог быть более компактным за счет вызова другой перегруженной версии метода Add. Эта альтернативная версия принимает значения для всех необходимых свойств-параметров в одном вызове метода с длинным списком параметров.
Невзирая на большой размер, код подпрограммы LoadExplicitCode имеет очень простую и понятную структуру, если определен интерфейс (параметры и типы) для хранимых процедур. Для всех свойств объекта Command создается новый экземпляр объекта SQLCommand. Ему присваивается общий объект Connection и задаются значения свойств CommandType и CommandText. Затем нужно создать и конфигурировать все параметры каждой команды.
Скомпонуем проект DataSetCode и снова проверим работоспособность полученного приложения. Оно будет работать как и прежде, но теперь в подпрограмме LoadExplicitCode используются специализированные команды для обновления базы данных. Этот подход требует больших усилий по созданию кода, но является более гибким, предлагает более высокую производительность и централизованное управление хранимыми процедурами.
Вставка бизнес-логики в команды обновления
Прежде уже описывалось, как хранимые процедуры для специализированных команд обновления можно использовать для вставки бизнес-логики в хранимые процедуры, которые вызываются автоматически. По сравнению с прежними версиями модели ADO и другими моделями доступа к данным новизна заключается не во вставке логики в хранимые процедуры, поскольку эта функциональная возможность существовала и раньше. Дело в том, что эти хранимые процедуры вызываются автоматически при выполнении "пакетных" обновлений вместо явной организации вызовов в коде программы.
Для демонстрации этого подхода попробуем изменить хранимую процедуру. Предположим, что бизнес-логика определяется следующим образом: если при вставке новой записи о сотруднике значение зарплаты в поле Salary не определено или равно 0, то для него автоматически задается значение, определяемое функцией отдела. Для реализации этой бизнес-логики применим очень простой механизм: автоматически присвоенное значение будет равно произведению номера отдела и значения 10000. (Конечно, в реальных условиях компания может использовать более удачный алгоритм для указания этого значения!) Измененная хранимая процедура теперь будет выглядеть так, как показано ниже.