Точно такое же обновление можно выполнить с помощью хранимой процедуры, что позволяет добиться более высокой производительности и централизованно хранить код. Потенциальным недостатком использования хранимых процедур является необходимость назначения администратора базы данных или специалиста с опытом создания хранимых процедур. В крупных организациях порой уходят целые дни на то, чтобы администратор базы данных изменил хранимые процедуры, которые можно самостоятельно изменить за несколько минут. Хранимые процедуры создаются с помощью программ SQL Server Enterprise Manager или SQL Query Analyzer, которые описаны в главе 3, "Знакомство с SQL Server 2000". Это можно также сделать с помощью проекта DataProviderObjects, изменив команду SQL, как это делалось ранее.
Итак, в данном примере хранимая процедура имеет следующий вид:
CREATE PROCEDURE UpdateRoyalties
@param1 int
AS
UPDATE roysched SET royalty = royalty + @param1
В листинге 4.6 для организации вызова хранимой процедуры потребуется заменить свойства CommandText и CommandType объекта Command.
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "UpdateRoyalties"
Запуск этой программы должен привести к тем же результатам, что и прежде, однако теперь обновление происходит благодаря хранимой процедуре, а не команде SQL из кода приложения.
Метод ExecuteScalar
Иногда нужно выполнить команду, которая возвращает
Включим приведенную ниже хранимую процедуру в базу данных pubs.
CREATE PROCEDURE AuthorsInState2
@param1 char(2)
AS
SELECT count(*) FROM authors WHERE state = @param1
Хранимая процедура AuthorsInState2 принимает параметр, который имеет двухсимвольный код штата, и возвращает из таблицы authors количество авторов из этого штата. Эта процедура с функциональной точки зрения эквивалентна процедуре AuthorsInState1 из листинга 4.5, но возвращает вычисленное значение для набора записей, а не только индикатор успешности выполнения команды.
Использование метода ExecuteScalar вместо метода ЕxecuteNonQuerу и передача скалярного значения с помощью параметра ReturnValue связаны с дополнительными накладными расходами. Зачем же его используют? Он проще в употреблении, потому что не нужно заботиться об указании параметров в определениях и вызовах команд.
Для вызова данной хранимой процедуры с помощью провайдера данных ODBC выполните следующее.
1. Создайте дополнительную кнопку под текстовым полем txtParam1.
2. В окне свойств Properties укажите значение cmdScalar для свойства (Name) и значение ExecuteScalar для свойства Text.
3. Создайте код подпрограммы btnExecuteScalar_Click, приведенный в листинге 4.7.
Private Sub btnExecuteScalar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnExecuteScalar.Click
Dim result As Integer
' Создание экземпляра объекта Connection.
Dim cnn As OdbcConnection = New OdbcConnection( _
"DRIVER={SQL Server};server=localhost;uid=sa;database=pubs")
' Создание экземпляра объекта Command.
Dim cmd As OdbcCommand = New OdbcCommand()
txtResults.Clear()
' Указание подключения и текста команды.
cmd.Connection = cnn
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "{call AuthorsInState2(?) }"
' Создание параметра и указание его значения