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

Свойства и методы объекта Command

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Применение методов объекта Command в Windows-приложениях. Параметризированные запросы

Мы рассмотрели основные методы объекта Command в консольных приложениях. Это дало нам возможность понять синтаксис самих методов, без привязки к какому-либо интерфейсу. Однако, после того как синтаксис стал ясен, возникает вопрос - как же использовать эти методы в реальных приложениях? Понятно, что простое копирование кода в конструктор формы, по сути, не изменит пример. Следовательно, мы должны привязывать вводимые значения, например, к текстовым полям. Но это означает, что параметры строки запроса будут неизвестны до тех пор, пока пользователь не введет соответствующие значения. Например, для метода ExecuteNonQuery строка commandText имела следующий вид:

myCommand.CommandText = "UPDATE Туристы SET
 Фамилия = 'Сергеева' WHERE Кодтуриста = 3";

Если мы создадим приложение, где пользователь будет вводить фамилию и код туриста, то мы не можем заранее указать, какие это будут значения. Логически запрос можно представить примерно так:

myCommand.CommandText = "UPDATE Туристы SET
 Фамилия = 'Какая-то_фамилия,_которую_введет_пользователь'
 WHERE Кодтуриста = Какой-то_код,_который_введет_пользователь";

Для решения таких задач, которые возникли еще в самом начале разработки языка SQL, были придуманы параметризированные запросы. В них неизвестные значения заменяются параметрами. Вот так:

myCommand.CommandText = "UPDATE Туристы SET
 Фамилия = @Family WHERE Кодтуриста = @TouristID";

Здесь @Family (обратите внимание, пишется без кавычек!) - параметр для неизвестного значения фамилии, @TouristID - параметр для неизвестного значения кода туриста. Теперь мы можем привязывать параметры к тексту, вводимому пользователем. Создайте новое Windows-приложение и назовите его "ExamWinExecuteNonQuery". Устанавливаем следующие свойства формы:

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

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

gropBox1, свойство Значение
Location 16; 16
Size 296; 112
Text Пример UPDATE
gropBox2, свойство Значение
Location 320; 16
Size 280; 176
Text Пример INSERT
gropBox3, свойство Значение
Location 16; 136
Size 296; 56
Text Пример DELETE
button1, свойство Значение
Name btnUpdate
Location 80; 80
Text Обновить
button2, свойство Значение
Name btnInsert
Location 88; 144
Text Добавить
button3, свойство Значение
Name BtnDelete
Location 208; 24
Text Удалить
textBox1, свойство Значение
Name TxtTouristIDUpdate
Location 16; 24
Size 224; 20
Text Введите код туриста
textBox2, свойство Значение
Name TxtFamilyUpdate
Location 16; 56
Size 224; 20
Text Введите фамилию туриста
textBox3, свойство Значение
Name TxtTouristIDInsert
Location 16; 24
Size 224; 20
Text Введите код туриста
textBox4, свойство Значение
Name TxtFamilyInsert
Location 16; 56
Size 224; 20
Text Введите фамилию туриста
textBox5, свойство Значение
Name TxtFirstNameInsert
Location 16; 88
Size 224; 20
Text Введите имя туриста
textBox6, свойство Значение
Name TxtMiddleNameInsert
Location 16; 120
Size 224; 20
Text Введите отчество туриста
textBox7, свойство Значение
Name txtTouristIDDelete
Location 8; 24
Size 192; 20
Text Введите код туриста для удаления

Форма в режиме дизайна будет иметь следующий вид (рис. 6.22):

 Приложение ExamWinExecuteNonQuery, вид формы в режиме дизайна

увеличить изображение
Рис. 6.22. Приложение ExamWinExecuteNonQuery, вид формы в режиме дизайна

Подключаем пространство имен для работы с базой данных:

using System.Data.SqlClient;

В классе формы создаем экземпляр conn7Мы это делаем для включения блока обработки исключений.:

SqlConnection conn = null;

Обработчик кнопки btnUpdate будет иметь следующий вид:

private void btnUpdate_Click(object sender, System.EventArgs e)
{
	try
	{
		//Создаем переменную Family, в которую помещаем значение,
		//введенное пользователем в поле txtFamilyUpdate:
		string Family = Convert.ToString(this.txtFamilyUpdate.Text);
		//Создаем переменную TouristID, в которую помещаем значение,
		//введенное пользователем в поле txtTouristIDUpdate:
		int TouristID = int.Parse(this.txtTouristIDUpdate.Text);
		conn = new SqlConnection();
		conn.ConnectionString = "integrated security=SSPI;data 
		 source=\".\"; persist security info=False;
		 initial catalog=BDTur_firm2";
		conn.Open();
		SqlCommand myCommand = conn.CreateCommand();
		myCommand.CommandText = "UPDATE Туристы
		 SET Фамилия = @Family WHERE Кодтуриста = @TouristID";
		//Добавляем параметр @Family в коллекцию параметров 
		//объекта myCommand
		myCommand.Parameters.Add("@Family",
		 SqlDbType.NVarChar, 50);
		//Устанавливаем значение параметра @Family
		//равным значению переменной Family
		myCommand.Parameters["@Family"].Value = Family;
		//Добавляем параметр @TouristID в коллекцию параметров 
		//объекта myCommand
		myCommand.Parameters.Add("@TouristID", SqlDbType.Int, 4);
		//Устанавливаем значение параметра @TouristID 
		//равным значению переменной TouristID
		myCommand.Parameters["@TouristID"].Value = TouristID;
		int UspeshnoeIzmenenie = myCommand.ExecuteNonQuery();
		if (UspeshnoeIzmenenie !=0)
		{
			MessageBox.Show("Изменения внесены", 
			 "Изменение записи");
		}
		else
		{
			MessageBox.Show("Не удалось внести изменения", 
			 "Изменение записи");
		}

	}
	catch(Exception ex)
	{
		MessageBox.Show(ex.ToString());
	}
	finally
	{
		conn.Close();
	}
}
< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Александра Тимофеева
Александра Тимофеева
Украина, Киев
Bakke Aleksander
Bakke Aleksander
Россия, Mуниципальный округ N 4