Опубликован: 05.08.2007 | Уровень: специалист | Доступ: платный
Лекция 7:

Вызов хранимых процедур. Работа с транзакциями

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >

Вызов хранимых процедур с входными и выходными параметрами

На практике наиболее часто используются хранимые процедуры с входными и выходными параметрами (см. таблицу 5.3). Создайте новое приложение и назовите его "VisualOutputParameter". Устанавливаем следующие свойства формы:

Form1, форма, свойство Значение
FormBorderStyle FixedSingle
MaximizeBox False
Size 400; 96

Добавляем на форму элементы управления и устанавливаем их свойства:

textBox1, свойство Значение
Name txtTouristID
Location 15; 20
Size 120; 20
Text Введите код туриста
label1, свойство Значение
Name lblFamily
Location 151; 20
Size 144; 23
Text
button1, свойство Значение
Name btnRun
Location 303; 20
Text Запуск

Переходим на вкладку Server Explorer, раскрываем узел Stored Procedures базы данных BDTur_firm2 и перетаскиваем процедуру proc_po1. Выделяем появившейся объект sqlCommand1, в окне Properties нажимаем на кнопку(...) для перехода к редактору SqlParameter Collection Editor. Среда сгенерировала три параметра - @RETURN_VALUE, @TouristID, @LastName (рис. 7.4):

Приложение VisualOutputParameter. Свойство Parameters объекта sqlCommand1

увеличить изображение
Рис. 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):

Готовое приложение VisualOutputParameter

Рис. 7.5. Готовое приложение VisualOutputParameter

При использовании визуальных средств код в обработчике ничем не отличается от рассматриваемого ранее - мы нигде не указывали значение 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).

Значения перечисления ParameterDirection

Рис. 7.6. Значения перечисления ParameterDirection

Для параметров, работающих в двустороннем режиме, устанавливается значение InputOutput, для параметров, возвращающих данные о выполнения хранимой процедуры, - ReturnValue. Примером последнего может служить @RETURN_VALUE (см. рис. 7.4).

В программном обеспечении к курсу вы найдете приложения Visual OutputParameter и ProgrammOutputParameter (Code\Glava3 \VisualOutput Parameter и ProgrammOutputParameter).

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Александра Тимофеева
Александра Тимофеева
Украина, Киев
Bakke Aleksander
Bakke Aleksander
Россия, Mуниципальный округ N 4