Чтение онлайн

ЖАНРЫ

Обработка баз данных на Visual Basic®.NET

Прайс Кевин Т.

Шрифт:

8. В окне Properties укажите значение Archive all orders for the year для свойства Text надписи, значение OK для кнопки btnOK и значение Cancel для кнопки btnCancel.

9. Расположите все элементы управления, как показано на рис. 4.6.

РИС. 4.6. Расположение элементов управления в форме frmArchive

В верхней части файла с исходным кодом вставьте приведенную ниже строку кода для импорта пространства имен SqlClient.

Imports System.Data.SqlClient

В теле определения

класса для формы frmArchive включите код из листинга 4.10.

Листинг 4.10. Код архивирования данных в новой таблице

Private Sub frmArchive_Load(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles MyBase.Load

 lstYears.Items.Add("1995")

 lstYears.Items.Add("1996")

 lstYears.Items.Add("1997")

 lstYears.Items.Add("1998")

 lstYears.Items.Add("1999")

 lstYears.Items.Add("2000")

 lstYears.Items.Add("2001")

 lstYears.Items.Add("2002")

 ' Указание значения по умолчанию.

 lstYears.SelectedIndex = 0

End Sub

Private Sub btnCancel_Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles btnCancel.Click

 Me.Close

End Sub

Private Sub btnOK_Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) Handles btnOK.Click

 Dim sql As String

 Dim result As Integer

 Dim records As Integer

 Dim SelectedYear As String

 ' Создание экземпляров объектов Connection и Command.

 Dim cnn As SqlConnection = New SqlConnection( _

"server=localhost;uid=sa;database=novelty")

 Dim cmd As New SqlCommand

 Dim trans As SqlTransaction

 ' Получение значения года.

 SelectedYear = lstYears.SelectedItem.ToString

 ' Размещение кода внутри блока Try-Catch для

 ' обработки исключительных ситуаций.

 Try

' Открытие объекта Connection и запуск транзакции.

cnn.Open

trans = cnn.BeginTransaction

' Включение команды в транзакцию.

cmd.Connection = cnn

cmd.Transaction = trans

' Указание команды SQL для вставки соответствующих

' записей в архивную таблицу.

sql = "SELECT * INTO tblOrder" & SelectedYear & _

FROM tblOrder WHERE year (OrderDate) = " & SelectedYear

'
Передача текста команды SQL в транзакцию.

cmd.CommandText = sql

result = cmd.ExecuteNonQuery

' Отображение результатов вставки записей в архивную таблицу.

If result > 0 Then

records = result MessageBox.Show(records & _

" records inserted successfully into tblOrder" & SelectedYear)

Else

MessageBox.Show( _

"No records inserted into tblOrder" & SelectedYear)

' При отсутствии записей созданная таблица

' не нужна и транзакцию нужно откатить.

trans.Rollback

End If

If records > 0 Then

' Команда SQL для удаления соответствующих

' записей из текущей таблицы.

sql = "delete FROM tblOrder WHERE year (OrderDate) = " _

& SelectedYear

' Эта команда находится в той же транзакции.

cmd.CommandText = sql

result = cmd.ExecuteNonQuery

' Показать результаты удаления записей.

If result = records Then

MessageBox.Show(records & _

" records deleted successfully")

' Все действия успешно выполнены, можно фиксировать транзакцию.

trans.Commit

Else

MessageBox.Show("No records deleted!")

End If

Else

' Никаких действий.

End If

 Catch ex As Exception

' Какие-то действия не выполнены, поэтому нужно

' отменить (откатить) всю транзакцию.

Try

' Отображение сообщения об ошибке.

MessageBox.Show(ex.Message & _

ControlChars.CrLf & ControlChars.CrLf & _

"Transaction Failed!")

trans.Rollback

Catch ex2 As Exception

End Try

 Finally

cnn.Close

 End Try

End Sub

Подпрограмма frmArchive_Load инициализирует список lstYears значениями, из которых можно выбрать год архивирования, и выбирает используемый по умолчанию год. Конечно, эту подпрограмму можно было бы усовершенствовать так, чтобы в списке отображались только те годы, для которых существуют записи о заказах. Однако для демонстрации принципов работы транзакций достаточно и такой подпрограммы.

Поделиться с друзьями: