Украина, Киев |
Вызов хранимых процедур. Работа с транзакциями
Вызов хранимых процедур с входными и выходными параметрами
На практике наиболее часто используются хранимые процедуры с входными и выходными параметрами (см. таблицу 5.3). Создайте новое приложение и назовите его "VisualOutputParameter". Устанавливаем следующие свойства формы:
Добавляем на форму элементы управления и устанавливаем их свойства:
Переходим на вкладку Server Explorer, раскрываем узел Stored Procedures базы данных BDTur_firm2 и перетаскиваем процедуру proc_po1. Выделяем появившейся объект sqlCommand1, в окне Properties нажимаем на кнопку(...) для перехода к редактору SqlParameter Collection Editor. Среда сгенерировала три параметра - @RETURN_VALUE, @TouristID, @LastName (рис. 7.4):
увеличить изображение
Рис. 7.4. Приложение VisualOutputParameter. Свойство Parameters объекта sqlCommand1
Сообщение об успешности выполнения команды возвращается при помощи параметра @RETURN_VALUE, значение которого для запроса данной хранимой процедуры будет равно нулю. Для процедур, содержащих запросы UPDATE, INSERT и DELETE, возвращаемое значение будет равно числу измененных записей. Обратите внимание, в тексте процедуры мы не создавали этот параметр - среда сгенерировала его автоматически! Два последних параметра были определены при создании хранимой процедуры. Подключаем пространство имен для работы с базой:
using System.Data.SqlClient;
В обработчике кнопки btnRun выводим фамилию искомого туриста в качестве текста надписи:
private void btnRun_Click(object sender, System.EventArgs e) { try { int TouristID = int.Parse(this.txtTouristID.Text); sqlCommand1.Parameters["@TouristID"].Value = TouristID; sqlConnection1.Open(); sqlCommand1.ExecuteScalar(); lblFamily.Text = Convert.ToString(sqlCommand1.Parameters["@LastName"].Value); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { sqlConnection1.Close(); } }
Запускаем приложение. Если в таблице имеется фамилия, соответствующая заданному коду, она выводится на форму (рис. 7.5):
При использовании визуальных средств код в обработчике ничем не отличается от рассматриваемого ранее - мы нигде не указывали значение output параметра @LastName. Дело в том, что среда сама настроила это значение в свойстве Direction (см. рис. 7.4). При программном вызове хранимой процедуры нам придется определять его вручную. Скопируйте папку приложения VisualOutputParameter и переименуйте ее в "ProgrammOutputParameter". Открываем проект, удаляем все объекты с панели компонент формы. В классе формы создаем объект Connection:
SqlConnection conn = null;
Обработчик кнопки btnRun принимает следующий вид:
private void btnRun_Click(object sender, System.EventArgs e) { try { conn = new SqlConnection(); conn.ConnectionString = "integrated security=SSPI;data source=\".\"; persist security info=False; initial catalog=BDTur_firm2"; SqlCommand myCommand = conn.CreateCommand(); myCommand.CommandType = CommandType.StoredProcedure; myCommand.CommandText = "[proc_po1]"; int TouristID = int.Parse(this.txtTouristID.Text); myCommand.Parameters.Add("@TouristID", SqlDbType.Int, 4); myCommand.Parameters["@TouristID"].Value = TouristID; //Необязательная строка, т.к. совпадает со значением по умолчанию. //myCommand.Parameters["@TouristID"].Direction = ParameterDirection.Input; myCommand.Parameters.Add("@LastName", SqlDbType.NVarChar, 60); myCommand.Parameters["@LastName"].Direction = ParameterDirection.Output; conn.Open(); myCommand.ExecuteScalar(); lblFamily.Text = Convert.ToString (myCommand.Parameters["@LastName"].Value); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { conn.Close(); } }
Мы добавили параметр @LastName в набор Parameters, причем его значение output указали в свойстве Direction:
myCommand.Parameters["@LastName"].Direction = ParameterDirection.Output;
Параметр @TouristID является исходным, поэтому для него в свойстве Direction указывается Input. Поскольку это является значением по умолчанию для всех параметров набора Parameters, указывать его явно не нужно. Перечисление ParameterDirection принимает еще два значения - InputOutput и ReturnValue (рис. 7.6).
Для параметров, работающих в двустороннем режиме, устанавливается значение InputOutput, для параметров, возвращающих данные о выполнения хранимой процедуры, - ReturnValue. Примером последнего может служить @RETURN_VALUE (см. рис. 7.4).
В программном обеспечении к курсу вы найдете приложения Visual OutputParameter и ProgrammOutputParameter (Code\Glava3 \VisualOutput Parameter и ProgrammOutputParameter).