Программный доступ к каждой ячейке таблицы через DataSet
Пришло время работать с базами данных программным способом. Прежде всего, нам, естественно, нужен доступ к любой ячейке нашей таблицы.
Для этого нам нужно кое-что знать о строении объекта DataSet. Я не буду перечислять все свойства и методы класса DataSet. Не буду также останавливаться на типах свойств. Нам пока достаточно знать, что объект DataSet включает коллекцию Tables, состоящую из таблиц типа DataTable, входящих в базу. Каждая таблица из этой коллекции включает в свою очередь коллекцию Columns столбцов (полей) типа DataColumn и коллекцию Rows строк (записей) типа DataRow. Каждая строка к тому же позволяет обращаться к своим полям (ячейкам) по индексу, как к элементам массива. (Если вы подзабыли, что такое коллекции, перечитайте 16.2.)
Исходя из вышесказанного, приведу пример оператора, обеспечивающего доступ к ячейке нашей таблицы:
Debug.WriteLine (DataSet11.Tables ("Книги") .Rows (4)(2))
Этот оператор распечатает название книги Ефремова «Туманность Андромеды».
Пояснения: Выражение
DataSet11.Tables("Книги")
есть объект, представляющий нашу таблицу «Книги». У него есть свойство Rows, являющееся коллекцией строк таблицы. Строки пронумерованы с нуля, поэтому выражение
DataSet11.Tables("Книги").Rows(4)
есть не что иное, как запись о книге Ефремова «Туманность Андромеды».
Каждая запись – это объект. Отдельные поля записи тоже пронумерованы с нуля, поэтому выражение
DataSet11.Tables("Книги").Rows(4)(2)
есть не что иное, как название
книги Ефремова «Туманность Андромеды».
Значения ячеек таблицы можно менять банальным присваиванием. Оператор
DataSet11.Tables ("Книги") .Rows (1)(4)= 208
устанавливает книге Конан Дойля «Затерянный мир» число страниц равное 208.
Экономим чернила. VB допускает и сокращенный синтаксис. Так, когда вы поставите точку после имени нашего объекта DataSet11, вы увидите в раскрывшемся списке готовенькое и удобное для нас свойство Книги, имеющее своим значением нашу таблицу «Книги». Открыв скобку после слова Книги, мы увидим приглашение ввести индекс – номер строки из этой таблицы. В результате вместо длинного
Обратите внимание, что для только-что описанного способа работы с ячейками таблицы нам совершенно не нужно было иметь на форме элемент DataGrid. Вся работа велась через DataSet. То есть, описанный способ хорош для работы вслепую, когда умный компьютер без нашего ведома делает свои дела с базой данных. Однако часто мы хотим совмещать ручной и программный способы работы, наблюдая базу данных воочию или даже вводя в нее изменения от руки. В этом случае наличие DataGrid очень удобно.
Имейте в виду, что порядок строк в DataGrid и DataSet неодинаков. Как только вы посортируете записи в DataGrid щелчками по заголовкам полей, их порядок в сетке DataGrid, естественно, переменится. А вот в DataSet он останется прежним. Вам вполне может захотеться работать именно с ячейками DataGrid, а не DataSet. Например, заполнить список или массив из отсортированного поля из DataGrid вам может показаться приятнее, чем из того же неотсортированного поля из DataSet. Для этого вам нужен доступ к ячейкам DataGrid.
Я не буду останавливаться на многочисленных и полезных свойствах и методах DataGrid. Здесь я воспользуюсь только свойством Item, о котором удобно думать, как о двумерном массиве ячеек DataGrid. Вот примеры:
Debug.WriteLine(DataGrid1.Item(4, 2))
DataGrid1.Item(5, 3) = #12/30/1831#
Если вы еще не успели отсортировать сетку, то первый оператор напечатает «Туманность Андромеды», а второй установит книге Гоголя «Сорочинская ярмарка» дату 30.12.1831.
Примечание: Вы только что программным методом установили значение #12/30/1831# в ячейке DataGrid. Автоматически оно изменилось и в DataSet. Однако, возьмите на заметку, что довести эти изменения до исходного файла базы данных у вас так просто не получится. Проще программно менять значения ячеек непосредственно в DataSet, как мы делали раньше.
Выводы. Теперь вы можете заполнять из базы данных массивы простых переменных, массивы структур, списки, текстовые поля или любые другие подходящие элементы управления на форме, чтобы в дальнейшем работать с ними привычными методами. Вот фрагмент, заполняющий список ListBox1 названиями книг из DataGrid1:
For i = 0 To DataSet11.Книги.Rows.Count - 1
ListBox1.Items.Add(DataGrid1.Item(i, 2))
Next
Пояснения: Число 2 – это номер столбца с названиями книг. Выражение DataSet11.Книги.Rows.Count – это количество (Count) строк (Rows) в таблице DataSet11.Книги.
Впрочем, вы можете настроить заполнение ListBox еще на этапе проектирования, зайдя в окно свойств и выбрав для его свойства DataSource значение DataSet11.Книги, а для свойства DisplayMember значение Nazvanie.
DataSet11.Tables("Книги").Rows(4)(2)
получим короткое
DataSet11.
Книги (4)(2)
К полям записи можно обращаться и по имени поля. Выражение
DataSet11.Книги (4) ("Nazvanie")
тождественно предыдущему.
Еще больше экономим чернила. Чтобы избежать необходимости при обращении к ячейкам таблицы все время записывать фрагмент DataSet11.Книги, объявите коротенькую переменную типом коллекции строк таблицы:
Dim D As DataRowCollection
Затем выполните оператор
D = DataSet11.Книги.Rows
присваивающий этой переменной значение коллекции строк из конкретной таблицы Книги.
Теперь к этой коллекции вы можете обращаться и при помощи переменной D, например, так:
D (2)(4) = 500
Вот фрагмент, распечатывающий всю нашу таблицу:
Dim i, j As Integer
For i = 0 To 5
For j = 0 To 4
Debug.WriteLine (D(i)(j))
Next
Next
Вот фрагмент, делающий то же по-другому:
Dim j As Integer
Dim Запись As DataRow
For Each Запись In D
For j = 0 To 4
Debug.WriteLine(Запись(j))
Next
Next
Задание 20.
Увеличьте на 2 число страниц в каждой книге из таблицы.