Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
my_clientservTechDBMS_2012.doc.doc
Скачиваний:
17
Добавлен:
13.11.2019
Размер:
1.55 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]