- •Методические указания к лабораторным работам
- •«Клиент-серверные технологии субд»
- •Санкт-Петербург
- •080801 – Прикладная информатика в экономике и
- •Содержание
- •Цель работы
- •Программно - техническая платформа
- •Теоретическая часть
- •Перечень заданий к лабораторной работе
- •Порядок выполнения лабораторной работы
- •5.1 Разработка клиент-серверного приложения баз данных (тонкий клиент, толстый клиент, n-tier архитектура)
- •5.1.2 Создание приложения Course Manager в среде Visual Studio 2010
- •5.1.3 Формирование модели edm
- •5.1.4 Запрос данных о факультетах из базы данных School
- •5.1.5 Сохранение изменений, внесенных в объекты
- •5.2. Дизайн модели данных и ее использование в клиент-серверном приложении
- •5.3 Разработка клиент-серверных приложений баз данных с различными сценариям доступа к данным
- •Основы asp.Net Dynamic Data
- •5.4 Разработка распределенных приложений баз данных в клиент-серверной архитектуре с использованием сервисов данных
- •5.4.1. Создание сервиса данных
- •5.4.2 Создание клиентского приложения
- •5.5 Асинхронные приложения баз данных в клиент-серверной технологии субд
- •Содержание отчета по лабораторной работе
- •Список литературы
- •7.1 Основная
- •7.2 Дополнительная:
- •Приложения
- •Образец титульного листа отчета по лабораторной работе
- •Клиент-серверные технологии субд отчет по лабораторным работам
5.5 Асинхронные приложения баз данных в клиент-серверной технологии субд
В этом задании показаны несколько важных приемов, в том числе вызов метода, который взаимодействует с формой из отдельного потока. Кроме того, показано, как блокировать попытки пользователей одновременно выполнять команду несколько раз и как гарантировать, что форма не закроется до вызова процедуры ответного вызова.
Открываем пакет Visuail Studio 2010. Выбираем элемент меню “File \ New Project”. В окне выбираем тип проекта “Windows Forms Application” и нажимаем “Ok”.
На Form1 в режиме дизайнера поместите в форму элемент управления Button и два элемента управления Label (приняв для каждого из них имя по умолчанию). Открываем файл form1.cs и в начало файла вставляем ссылки на пространства имен.
using System;
using System.Data;
using System.Data.SqlClient;
В класс формы добавляем следующий код, изменив строку соединения с базой данных в соответствии с вашей средой.
private delegate void DisplayInfoDelegate(string Text);
private bool isExecuting;
private SqlConnection connection;
private static string GetConnectionString()
{
return "Data Source=(local);Integrated Security=SSPI;" +
"Initial Catalog=AdventureWorks; Asynchronous Processing=true";
}
private void DisplayStatus(string Text)
{
this.label1.Text = Text;
}
private void DisplayResults(string Text)
{
this.label1.Text = Text;
DisplayStatus("Ready");
}
private void Form1_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
if (isExecuting)
{
MessageBox.Show(this, "Can't close the form until " +
"the pending asynchronous command has completed. Please " +
wait...");
e.Cancel = true;
}
}
private void button1_Click(object sender, System.EventArgs e)
{
if (isExecuting)
{
MessageBox.Show(this, "Already executing. Please wait until " +
"the current query has completed.");
}
else
{
SqlCommand command = null;
try
{
DisplayResults("");
DisplayStatus("Connecting...");
connection = new SqlConnection(GetConnectionString());
string commandText =
"WAITFOR DELAY '0:0:05';" +
"UPDATE Production.Product " +
"SET ReorderPoint = ReorderPoint + 1 " +
"WHERE ReorderPoint Is Not Null;" +
"UPDATE Production.Product " +
"SET ReorderPoint = ReorderPoint - 1 " +
"WHERE ReorderPoint Is Not Null";
command = new SqlCommand(commandText, connection);
connection.Open();
DisplayStatus("Executing...");
isExecuting = true;
AsyncCallback callback = new AsyncCallback(HandleCallback);
command.BeginExecuteNonQuery(callback, command);
}
catch (Exception ex)
{
isExecuting = false;
DisplayStatus(
string.Format("Ready (last error: {0})", ex.Message));
if (connection != null)
{
connection.Close();
}
}
}
}
private void HandleCallback(IAsyncResult result)
{
try
{ SqlCommand command = (SqlCommand)result.AsyncState;
int rowCount = command.EndExecuteNonQuery(result);
string rowText = " rows affected.";
if (rowCount == 1)
{
rowText = " row affected.";
}
rowText = rowCount + rowText;
DisplayInfoDelegate del =
new DisplayInfoDelegate(DisplayResults);
this.Invoke(del, rowText);
}
catch (Exception ex)
{
this.Invoke(new DisplayInfoDelegate(DisplayStatus),
String.Format("Ready(last error: {0}", ex.Message));
}
finally
{
isExecuting = false;
if (connection != null)
{
connection.Close();
}
}
}
private void Form1_Load(object sender, System.EventArgs e)
{
this.button1.Click += new System.EventHandler(this.button1_Click);
this.FormClosing += new System.Windows.Forms.
FormClosingEventHandler(this.Form1_FormClosing);
}
В свойствах кнопки для события OnClick из выпадающего списка выбираем обработчик нажатия кнопки button1_click(…). Выбираем в дизайнере свойств элемент Form1 и для нее аналогичным образом выбираем на событие Form_closing(…) из выпадающего списка одноименный обработчик. Сохраняем проект, компилируем, проверяем работоспособность.