1432
.pdf8.5.Обработка массива записей
Спомощью q-операторов можно обрабатывать сложные структуры. Например, пусть имеется массив A типа stud.
structure stud public string Name public int Grp public double Res end structure
Запрос From – In - Order By - Descending позволяет сортировать записи по одному из полей Res в порядке убывания.
Dim b = From x In A Order By x.Res Descending
Пример программы
В примере создается массив типа «Структура». Массив заполняется данными, а затем выполняется запрос – сортировка по возрастанию. Исходные данные и результат выводятся на экран.
‘Пример 8.3
Module Module1
‘объявление структуры
Structure stud
Public Name As String
Public Grp As Integer
Public Res As Double
End Structure
Sub Main()
‘объявление массива типа структура
Dim A(5) As stud
‘заполнение массива данными
For I As Integer = 0 To 5
A(I).Name = Str(I) + " студент"
A(I).Grp = 342
A(I).Res = Int(90 * Rnd() + 10)
99
Console.WriteLine(A(I).Name+Str(A(I).Grp)+Str(A(I).Res))
Next
Console.WriteLine()
‘ выполнение запроса и вывод результатов на экран
Dim b = From x In A Order By x.Res Ascending For Each c In b
Console.WriteLine(c.Name + Str(c.Grp) + Str(c.Res)) Next
Console.ReadLine()
End Sub
End Module
8.6. Задания на тему «Обработка массива записей»
Разработать программу, выполняющую сортировку и фильтр массива записей. Исходные данные подготовить в текстовом файле в соответствии с вариантом задания. Результат отобразить на экране, а также в текстовом файле.
Вариант 1. Известны сведения о товарах: название, цена, количество. Создать процедуру обработки массива записей, содержащих данные сведения.
Вариант 2. Известны сведения о вакансиях: должность, категория, оклад. Создать процедуру обработки массива записей, содержащих данные сведения.
Вариант 3. Известны сведения о перевозках пассажиров: водитель, номер автобуса, количество пассажиров. Создать процедуру обработки массива записей, содержащих данные сведения.
Вариант 4. Известны сведения о студентах: фамилия, группа, курс. Создать процедуру обработки массива записей, содержащих данные сведения.
Вариант 5. Известны сведения о зданиях: адрес, цена, площадь. Создать процедуру обработки массива записей, содержащих данные сведения.
Вариант 6. Известны сведения о бегунах: фамилия, время, место. Создать процедуру обработки массива записей, содержащих данные сведения.
100
Вариант 7. Известны сведения о книгах: название, автор, цена. Создать процедуру обработки массива записей, содержащих данные сведения.
Вариант 8. Известны сведения о городах: название, население, площадь. Создать процедуру обработки массива записей, содержащих данные сведения.
Вариант 9. Известны сведения о машинах: модель, цена, год выпуска. Создать процедуру обработки массива записей, содержащих данные сведения.
Вариант 10. Известны сведения о выборах: кандидат, партия, количество голосов. Создать процедуру обработки массива записей, содержащих данные сведения.
Порядок выполнения лабораторной работы
Создать папку с набором тестовых данных.
Создать новый проект – приложение Windows Forms.
Вынести на форму необходимые визуальные компоненты.
Добавить программный код обработки событий.
Компилировать программу.
Тестировать программу.
Создать документ с описанием работы программы.
101
9. РАБОТА С БАЗОЙ ДАННЫХ
Задачи обработки данных делятся на несколько процессов. Вопервых, необходимо подключиться к источнику данных, а затем выбрать данные, которые требуется отобразить. После импорта данных в приложение требуется организовать их временное хранение, например в объекте DataSet. На рис. 9.1 изображены основные процессы обработки данных.
Рис. 9.1. Цикл обработки данных
9.1. Чтение информации из базы данных
Если для пользователя требуется только просмотр базы данных, без изменения, то для реализации соответствующего приложения можно использовать возможности управляемого провайдера OLE DB: в том числе для соединения с базой данных использовать класс
OleDbConnection; для построения запроса – класс OleDbCommand;
для чтения данных – класс OleDbDataReader; для обработки исключительных ситуаций – класс OleDbException.
Управляемый провайдер OLE DB
Вместе с ADO.NET поставляются два управляемых провайдера. Управляемый провайдер OLE DB можно использовать для доступа к
MS Access, Oracle, MS SQL Server 7.0. Управляемый провайдер SQL
может обращаться к данным только MS SQL Server 7.0 и последующих версий. Если для доступа к данным используется OLE DB, то необходимо указать соответствующее пространство имен: using System.Data.OleDb
102
В табл. 9.1 представлены важнейшие типы пространства имен
System.Data.OleDb.
|
Таблица 9.1 |
Типы пространства имен System.Data.OleDb |
|
|
|
Тип |
Описание |
|
|
OleDbCommand |
Представляет запрос SQL к источнику данных |
|
|
OleDbConnection |
Представляет открытое соединение с источником данных |
|
|
|
Представляет соединение с БД и набор команд, |
OleDbDataAdapter |
используемых для заполнения объекта DataSet, а также |
|
обновления исходной БД после внесения изменений в DataSet |
|
|
OleDbDataReader |
Обеспечивает метод считывания потока данных из источника |
|
|
OleDbException |
Исключение, возникающее при ошибке |
|
|
OleDbPatameter |
Используется для передачи параметров процедуре, хранимой |
на источнике данных |
|
|
|
Соединение с базой данных
Для установления соединения с базой данных необходимо создать строку соединения (connection string). С ее помощью можно задать имя компьютера, параметры безопасности, имя базы данных, имя провайдера. В табл. 9.2 представлены некоторые провайдеры
OLE DB.
|
Таблица 9.2 |
Наиболее часто используемые провайдеры OLE DB |
|
|
|
Значение |
Описание |
|
|
Microsoft.Jet.OLEDB.4.0 |
Используется для подключения к Access |
|
|
MSDAORA |
Для подключения к базам данных Oracle |
|
|
SQLOLEDB |
Для подключения к базам данных MS SQL Server |
|
|
Объект OleDbConnection представляет уникальное подключение к источнику данных. В случае с системой базы данных типа «Клиентсервер» это эквивалентно сетевому подключению к серверу. Класс OleDbConnection содержит члены (табл. 9.3), позволяющие настраивать различные параметры подключения.
103
|
|
Таблица 9.3 |
|
|
Члены класса OleDbConnection |
||
|
|
|
|
Член класса |
|
Описание |
|
BeginTransaction |
|
|
|
CommitTransaction |
|
Начать транзакцию, завершить ее или отменить |
|
RollbackTransaction |
|
|
|
Close() |
|
Закрыть соединение |
|
ConnectionString |
|
Настройка строки подключения |
|
ConnectionTimeout |
|
Установить время тайм-аута |
|
DataBase |
|
Установить имя базы данных |
|
DataSource |
|
Установить имя источника |
|
Open() |
|
Открыть соединение с базой данных |
|
Provider |
|
Установить имя провайдера |
|
State |
|
Получить информацию о состоянии соединения |
|
В строке, создаваемой ниже для объекта соединения Cnt, указано имя провайдера Microsoft.Jet.OLEDB.4.0, а также адрес базы данных на локальной машине.
Dim Cnt As New OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0; _
Data Source= c:\_Pro\P651\P651\BIN\DEBUG\auto.mdb")
После настройки строки соединения требуется создать запрос к базе данных Cmd – объект класса OleDbCommand (члены класса в табл. 9.4) и открыть сеанс соединения с источником данных с помощью метода Open.
Dim Cmd As New OleDbCommand(“Select * from Ts”, Cnt) Cnt.Open()
|
Таблица 9.4 |
|
|
Члены класса OleDbCommand |
|
|
|
|
Член класса |
Описание |
|
Cancel() |
Прекращает выполнение команды |
|
CommandText |
Позволяет задать текст запроса на языке SQL |
|
Connection |
Позволяет получить ссылку на объект OleDbConnection |
|
ExecuteReader() |
Возвращает объект OleDbDataReader |
|
Prepare() |
Готовит команду к выполнению |
|
|
Построение команды SQL |
Обработка и анализ данных осуществляется посредством запроса, одним из параметров которого является объект соединения Cnt, а
104
другим – команда на языке SQL, например, команда просмотра всех записей таблицы Владельцы:
OleDbCommand Cmd1 = new _ OleDbCommand("SELECT * FROM владельцы", Cnt)
В данной команде использована простейшая форма оператора SELECT, который предназначен для выборки данных:
SELECT список_столбцов FROM имя_таблицы
Столбцы в списке перечисляются через запятую, но если требуется выбрать все столбцы, то вместо списка указывается символ «*». Для отбора части строк в команду добавляется слово WHERE с соответствующим условием, например:
OleDbCommand Cmd1 = new OleDbCommand( _ "SELECT * FROM владельцы WHERE возраст>50", Cnt)
Для построения условий служат слова и символы, перечисленные в табл. 9.5.
|
Таблица 9.5 |
Элементы условия запроса |
|
|
|
Элементы |
Описание |
|
|
=, < >, <, >, >=, <= |
Операторы сравнения |
|
|
AND, OR, NOT |
Логические операторы |
|
|
BETWEEN знач1 AND знач2 |
Проверка на принадлежность интервалу |
|
|
IN (знач1, знач2, …) |
Проверка на принадлежность списку |
|
|
IS NULL |
Проверка на пустое значение |
|
|
IS NOT NULL |
Проверка на непустое значение |
|
|
LIKE шаблон |
Проверка на соответствие шаблону |
|
|
При описании шаблона LIKE используются символы: % – для произвольного количества символов; знак подчеркивания – для одного символа.
Упорядочение строк выполняется с помощью добавления в команду слова ORDER BY с указанием столбца, по которому должна выполняться сортировка в порядке возрастания. Если требуется сортировка по убыванию, то к ORDER BY добавляется параметр
DESC.
OleDbCommand Cmd1 = new OleDbCommand( _ "SELECT * FROM владельцы WHERE возраст>50 _ ORDER BY возраст DESC", Cnt)
105
Для отбора всех данных, за исключением повторяющихся, применяется ключевое слово DISTINCT, например следующая команда позволяет получить список фамилий (упорядоченный):
OleDbCommand Cmd1 = new OleDbCommand( _ "SELECT DISTINCT фамилия FROM владельцы", Cnt)
Изменение данных в таблице осуществляется с помощью оператора Update, один из вариантов формата которого
UPDATE имя_таблицы SET имя_столбца_1 = значение_1, _ имя_столбца_2 = значение_2, имя_столбца_3 = значение_3, . . .
Значением может быть константа или выражение, например: OleDbCommand Cmd2 = new OleDbCommand( _
"UPDATE Ts SET стоимость=стоимось*1.05)
После выполнения данного запроса все значения столбца Стоимость будут умножены на 1,05. Есть возможность применить команду Update только к тем строкам, которые удовлетворяют некоторому условию. Для этого в запрос добавляется слово Where с соответствующим условием. Например, следующий запрос изменяет поле Стоимость в тех строках, в которых значение текстового поля Модель начинается с букв ВАЗ.
OleDbCommand Cmd2 = new OleDbCommand( _ "UPDATE Ts SET стоимость=стоимось*1.15 _ WHERE модель LIKE ‘ВАЗ%’ ”)
Для того чтобы очистить значения столбца, используем константу Null, как в следующей строке:
OleDbCommand Cmd2 = new OleDbCommand( _ "UPDATE владельцы SET нарушения=NULL)
Чтение информации из базы данных
Класс OleDbDataReader предоставляет простой способ получения информации от источника данных. Этот класс предоставляет доступный только для чтения поток данных, который за один раз возвращает одну строку в ответ на запрос SQL. Создается объект класса OleDbDataReader с помощью метода ExecuteReader,
например объект Rd для определенного выше запроса Cmd: Dim reader As OleDbDataReader = Cmd.ExecuteReader()
106
Чтение записей выполняется последовательно (от первой к последней) с помощью метода Read.
Rd.Read()
Одно выполнение Read возвращает одну строку таблицы. Доступ к значениям столбцов после чтения строки выполняется по их индексу, начиная с 0, или по имени столбца. Например, в следующей строке один столбец выбирается по номеру, а другой по имени:
Console.WriteLine(Rd(0).ToString() + Rd(“фамилия”))
Некоторые методы класса OleDbDataReader перечислены в табл.
9.6.
Таблица 9.6
|
Методы класса OleDbDataReader |
Член класса |
Описание |
FieldCount |
Возвращает количество столбцов таблицы |
GetName |
Имя столбца |
GetType |
Тип данных столбца |
GetDouble |
Возвращает значения столбца типа double |
GetInt32 |
Возвращает значения столбца типа int |
GetString |
Возвращает значения столбца типа string |
GetValue |
Возвращает значения столбца в собственном формате |
Read |
Читает очередную запись |
Close |
Закрывает объект класса OleDbDataReader |
Закрывается объект класса OleDbDataReader с помощью метода
Close: reader.Close()
Для одного подключения OleDbConnection можно открыть более одного объекта DataReader. Если объект OleDbConnection выходит за границы области действия, он не закрывается. Поэтому следует в явном виде закрыть подключение, вызвав метод Close или Dispose либо воспользовавшись объектом OleDbConnection в операторе
Using:
Using connection As New OleDbConnection(connectionString)
Данная команда объявляет начало блока Using и получает системные ресурсы, которыми управляет блок. За нею следует блок операторов, запускаемый блоком Using. Завершается блок командой End Using, которая завершает определение блока и удаляет все ресурсы, которыми он управляет. Это делает ресурсы доступными
107
для использования другим кодом. Ниже приводится блок Using, содержащий чтение строк таблицы.
‘Пример 9.1
‘создается соединение с базой данных
Using connection As New OleDbConnection(connectionString)
‘ задается запрос
Dim command As New OleDbCommand(queryString, connection)
‘открывается соединение connection.Open()
‘создается объект OleDbDataReader
Dim reader As OleDbDataReader = command.ExecuteReader()
‘при каждом повторении цикла читается одна строка
While reader.Read()
‘значения столбцов из прочитанной строки выводятся на экран
Console.WriteLine(reader(0).ToString())
End While reader.Close() End Using
Пример программы
В программе выполняется чтение строк таблицы Stud из базы данных Prim.mdb. Выражение System.IO.Path.GetFullPath(".")
возвращает полный путь в текущий каталог, в котором расположена база данных. Создаются несколько запросов: фильтр, сортировка, модификация данных. В процедуре ReadData cоздается объект Rd класса OleDbDataReader. В цикле с помощью метода Read последовательно читаются строки таблицы. Отметим, что запрос Update только модифицирует, но не выполняет выборку данных, поэтому модифицированные им данные выводятся только по следующему за ним запросу Select.
108