Практическая работа №3 Просмотр и редактирование данных в

advertisement
Практическая работа №3 Просмотр и редактирование данных в БД
средствами Delphi.
Цель: просматр и редактирование данных таблицы БД средствами
Delphi ADO.
Теоретическая часть
Компонент DateSource
Компонент DataSource действует как посредник между компонентами
TDataSet (TTable, TQuery, TStoredProc) и компонентами Data Controls элементами управления, обеспечивающими представление данных на форме.
Компоненты TDataSet управляют связями с библиотекой Borland Database
Engine (BDE), а компонент DataSource управляет связями с данными в
компонентах Data Controls.
В типичных приложениях БД компонент DataSource, как правило,
связан с одним компоненом TDataSet (TTable или TQuery) и с одним или
более компонентами Data Controls (такими, как DBGrid, DBEdit и др.).
Связь этого компонента с компонентами TDataSet и DataControls
осуществляется с использованием следующих свойств и событий:

Cвойство DataSet компонента DataSource идентифицирует имя
компонента TDataSet. Можно присвоить значение свойству DataSet на
этапе выполнения или с помощью инспектора объектов на этапе
проектирования.

Cвойство
Enabled
компонента
DataSource
активизирует
или
останавливает взаимосвязь между компонентами TDataSource и Data
Controls. Если значение свойства Enabled равно true, то компоненты
Data Controls, связанные с TDataSource, воспринимают изменения
набора данных. Использование свойства Enabled позволяет временно
разъединять визуальные компоненты Data Controls и TDataSource,
например, для того, чтобы в случае поиска в таблице с большим
количеством записей не отображать на экране пролистывание всей
таблицы.

Свойство
AutoEdit
компонента
DataSource
контролирует,
как
инициируется редактирование в компонентах Data Controls. Если
значение свойства AutoEdit равно true, то режим редактирования
начинается непосредственно при получении фокуса компонентом Data
Controls, связанным с данным компонентом TDataSet. В противном
случае режим редактирования начинается, когда вызывается метод Edit
компонента TDataSet, например, после нажатия пользователем кнопки
Edit на компоненте DBNavigator. Событие OnDataChange компонента
DataSource наступает, когда происходит изменение значения поля,
записи, таблицы, запроса.

Cобытие OnUpdateData компонента DataSource наступает, когда
пользователь пытается изменить текущую запись в TDataSet.
Обработчик этого события следует создавать, когда требуется
соблюсти
условия
ссылочной
целостности
или
ограничения,
накладываемые на значения полей изменяемой базы данных.
Компонент ADOTable
Компонент ADOTable может использоваться в приложениях вместо
компонента Table, выполняющего аналогичные функции. Он вступает в
контакт с указанной таблицей базы данных. База данных задается свойствами
ConnectionString или Connection. Для управления таблицей в приложение
вводится, помимо компонента ADOTable, обычный компонент источника
данных DataSource, в свойстве DataSet которого задается имя компонента
ADOTable. Далее к этому источнику данных DataSource подключаются
любые компоненты отображения данных.
Имя
таблицы задается свойством
TableName.
Однако, не
все
провайдеры поддерживают непосредственный доступ к таблице по ее имени.
Они могут требовать доступ с помощью оператора SQL SELECT. Какой
именно вариант доступа: прямой или через оператор SELECT будет
использоваться,
определяется
свойством
По
TableDirect.
умолчанию
TableDirect = false, что означает автоматическое создание компонентом
ADOTable соответствующего оператора SELECT.
Соединение с базой данных осуществляется методом Open или
установкой в true свойства Active. Но при этом, если связь с базой данных
осуществляется
через
компонент
ADOConnection,
надо
учитывать
описанную выше взаимосвязь свойства Active компонента ADOTable и
свойства Connected компонента ADOConnection.
В компоненте ADOTable имеются два свойства, характеризующие
курсор, используемый при навигации по таблице. Одно из них –
CursorLocation описано выше. Другое – CursorType описывает иные
характеристики курсора. Это свойство может иметь значения:
· ctUnspecified - тип курсора не определен;
· ctOpenForwardOnly - курсор может перемещаться по таблице только
вперед. Этот тип курсора повышает производительность приложения;
· ctKeyset - при этом типе курсора записи, добавленные другими
пользователями, невидимы, а записи, удаленные другими пользователями,
недоступны. Этот тип используется по умолчанию;
· ctDynamic - этот тип динамического курсора обеспечивает видимость
всех
изменений,
сделанных
другими
пользователями:
модификаций,
удалений, вставок. Курсор может перемещаться по таблице вперед и назад;
· ctStatic - этот тип статического курсора обеспечивает копирование
записей. Изменения данных, сделанные другими пользователями, невидимы.
Свойство
MarshalOptions
определяет,
какие
именно
записи
возвращаются на сервер, если при работе используется клиентский курсор.
При значении MarshalOptions = moMarshalAll (значение по умолчанию) на
сервер возвращаются все записи, считанные в локальный набор записей
клиента. При значении MarshalOptions = moMarshalModifiedOnly на сервер
возвращаются только измененные записи.
Свойство CacheSize указывает, сколько записей заносится в локальный
буфер оперативной памяти. По умолчанию CacheSize = 1. Если задать,
например, CacheSize = 10, то при открытии базы данных в буфер загрузятся
первые 10 записей. Пока будет идти работа с этими записями, все операции
будут проводиться в оперативной памяти без обращения к базе данных. Если
указатель таблицы вышел за пределы 10, то в память загрузятся следующие
10 записей и т.д. Естественно, что буферизация записей повышает
эффективность работы.
Основные способы работы с ADOTable не отличаются от способов для
Table. Точно так же двойной щелчок на компоненте вызывает Редактор
Полей, в котором можно задать свойства отдельных полей, ничем не
отличающиеся от полей компонентов BDE. Впрочем, одно печальное
отличие есть: в компонентах ADO невозможно работать со словарями
данных, так что в каждом компоненте свойства поля приходится задавать
вручную. Словарь данных представляет собой совокупность определений БД
и атрибутов. Кроме того, надо иметь в виду, что не все драйверы ADO могут
работать с любыми типами полей.
Программный доступ к полям осуществляется так же, как в компоненте
Table: по индексу через свойство Fields[i:integer], по имени поля с помощью
метода FieldByName('<имя>'), по имени объекта поля.
Связь друг с другом компонентов ADOTable, работающих с разными
таблицами, одна из которых главная, а другая – вспомогательная,
осуществляется так же, как в компонентах Table, с помощью свойств
MasterSource и MasterFields.
Упорядочение
отображаемых
записей
производится
установкой
свойства IndexFieldNames. В этом свойстве можно задавать любое сочетание
имен полей, по которым вы хотите упорядочить отображение, разделяя их
точками с запятой. В отличие от свойства IndexFieldNames компонентов
BDE, в компонентах ADO можно задавать любые сочетания полей,
независимо от того, была ли индексирована таблица при ее создании по этим
полям. В этом проявляется дополнительная гибкость компонентов ADO. Но
зато в этих компонентах не работает свойство IndexName (хотя оно
присутствует в Инспекторе Объектов), позволяющее использовать индексы,
сформированные при создании таблицы.
Фильтрация отображаемых данных может осуществляется с помощью
свойства Filter, в котором записываются условия отбора. Отличие от
компонентов BDE заключается в том, что в компонентах ADO в строке Filter
имена полей обязательно должны отделяться пробелами от операций
отношения. Также пробелами должны окружаться логические операции and
и оr. Например, если в компонентах BDE фильтр может быть записан в виде:
(Year_b<=1960)and(Year_b>=1940)
то в компонентах ADO эта строка должна иметь вид:
(Year_b <= 1960) and (Year_b >= 1940)
Свойство Filter работает, если свойство Filtered = true.
Методы, используемые при программировании работы с базой данных,
в ADOTable в основном те же, что в Table. Навигация по таблице
осуществляется методами First, Next, Last и Prior. При редактировании
данных используются также методы, используемые для Table: Insert, Edit,
Post и другие. Из методов поиска в ADO реализованы только методы Locate
и Lookup.
Из методов, отсутствующих в компонентах BDE, интересными
представляются методы сохранения набора данных в файле и чтения его из
файла. Сохранение в файле осуществляется методом SaveToFile:
procedure SaveToFile(const FileName: String=' ';
Format: TPersistFormat = pfADTG);
Параметр FileName указывает имя файла, в котором сохраняется набор
данных. Необязательный параметр Format определяет формат файла. Этот
параметр может принимать одно из двух значений: pfADTG – формат ADTG
(Advanced Data Tablegram), или pfXML – формат XML. По умолчанию
принято значение pfADTG. Так что если оно устраивает, то сохранение
набора данных в файле может осуществляться, например, таким оператором:
ADOTable1.SaveToFile('Test.adt');
Чтение данных из файла осуществляется процедурой LoadFromFile:
procedure LoadFromFile (const FileName: WideString);
где FileName – имя файла. Загружать файл в набор данных можно даже
при закрытом соединении с базой данных. В момент загрузки соединение
автоматически откроется.
Методы
SaveToFile
и
LoadFromFile
удобно
использовать
для
получения мгновенного портрета данных на какой-то момент времени. Это
может требоваться, например для того, чтобы можно было восстановить
запомненное, а затем из-за каких-то ошибок испорченное состояние базы
данных.
Компонент DBGrid
Компонент
(StringGrid),
но
является
дальнейшим
предназначен
развитием
исключительно
обычной
для
таблицы
отображения
и
редактирования связанной с БД информации. Соответственно, у DBGrid нет
таких свойств, как Cells, Cols и Rows, поскольку все, что выводит этот
компонент - есть прямое отражение текущего содержимого связанной с ним
таблицы БД.
В то же время, у компонента DBGrid предусмотрен целый ряд
специальных свойств, предназначенных для взаимодействия с БД. Прежде
всего, это свойство DataSource, в котором указывают имя компонентаисточника данных. Так, если на форму, где уже имеются настроенные
соответствующим образом невизуальные компоненты Database, Table и
DataSource поместить таблицу, в свойстве DataSource которой указать
DataSource1, то мы сразу же увидим содержимое таблицы customer (рис. 1).
Рис. 1. Форма Delphi с таблицей БД
Следует сразу же отметить, что в качестве заголовков столбцов были
использованы названия полей таблицы БД. Кроме того, можно увидеть, что
столбец, содержащий числовые данные, имеет выравнивание по правому
краю, а строковые - по левому. Таким образом, очевидно, что компонент
DBGrid имеет более широкие возможности по оформлению таблиц, чем
обычная таблица StringGrid. Возможно это благодаря другому свойству
DBGrid - Columns, которое определяет оформление, количество и порядок
следования столбцов с данными. Это свойство представляет собой
коллекцию, состоящую из отдельных колонок таблицы. По умолчанию
используется автоматический режим вывода, когда выводятся все поля
данных с размерами, основанными на параметрах самих полей, заданных в
выводимой таблице БД. Но поскольку во многих случаях выводить все поля
не требуется, или же необходимо изменить параметры их вывода, как-то
порядок следования, цвет, шрифт, или ширину поля, то все эти настройки
доступны именно через свойство Columns. При этом каждый элемент этого
свойства представляет собой объект типа TColumn, имеющий, в свою
очередь, такие свойства, как заголовок (вместо стандартного названия поля в
БД) выравнивание, цвет фона, шрифт, возможность правки и т.д. Доступ ко
всем этим параметрам возможен через специальный редактор коллекций,
который можно вызвать, дважды щелкнув по самой таблице в режиме
разработки (рис. 2).
Рис. 2. Редактирование списка столбцов
На панели инструментов редактора столбцов имеется 4 кнопки - для
добавления и удаления столбцов, а так же для автоматического заполнения и
для сброса к начальным установкам. Выбирая поле из списка, и изменяя его
свойства в инспекторе объекта, вы тем самым изменяете параметры
отображения соответствующего столбца. А меняя в редакторе строки местам
(путем перетаскивания мышкой), вы меняете порядок вывода полей в самой
таблице.
Таким образом, мы рассмотрели 2 наиболее важных свойства
компонента DBGrid. Что касается всех собственных свойств, имеющихся у
таблицы для баз данных, то они перечислены в таблице 1.
Свойство
Columns
DataSource
FieldCount
Fields
Options
ReadOnly
SelectedField
SelectedIndex
Таблица 1. Собственные свойства компонента DBGrid
Тип
Описание
TDBGridColumns Задает параметры вывода столбцов с данными
Определяет источник данных для отображения в
TDataSource
таблице
Указывает на число столбцов с данными, выводимых в
Integer
таблице
Предоставляет доступ к информации ячейки,
array of TField
находящейся в указанном столбце
Определяет различные параметры отображения и
TDBGridOption
поведения таблицы
Определяет, будет ли у пользователя возможность
Boolean
править данные в таблице
Предоставляет доступ к информации в выделенной
TField
ячейке
Integer
Определяет номер текущего столбца
TitleFont
TFont
Определяет шрифт, используемый для вывода
заголовков столбцов таблицы
Здесь следует отдельно выделить свойство Options, позволяющее
настроить целый ряд различных параметров. Оно имеет следующие флаги:

dgEditing - Делает возможной правку данных прямо в таблице. Этот
флаг игнорируется, если включен флаг dgRowSelect;

dgAlwaysShowEditor - Таблица будет постоянно находиться в режиме
редактирования. В противном случае пользователь должен будет
нажимать F2, Enter, или щелкать мышкой по полю, чтобы ввести новое
значение;

dgTitles - Делает видимыми заголовки столбцов;

dgIndicator - Добавляет колонку, в которой будет отображаться
индикатор выбранной записи;

dgColumnResize - Делает возможным изменение размеров столбцов
пользователем;

dgColLines - Столбцы будут отделены разделительными линиями;

dgRowLines - Записи будут отделены разделительными линиями;

dgTabs - Делает возможной навигацию по ячейкам при помощи
клавиш Tab и Shift+Tab;

dgRowSelect - Записи будут выделяться целиком. При этом правка
данных в таблице становится невозможной (т.е. флаги dgEditing и
dgAlwaysShowEditor будут проигнорированы);

dgAlwaysShowSelection - Выбранная ячейка будет выделена цветом
даже если фокус вводе не находится на таблице;

dgConfirmDelete - Будет выдаваться предупреждение, если
пользователь захочет удалить запись в таблице (при помощи
Ctrl+Delete);

dgCancelOnExit - Предотвращает запись пустых записей;

dgMultiSelect - Делает возможным выбирать несколько записей
одновременно (с использованием клавиши Ctrl).
В типичном случае все производимые при разработке приложения
настройки компонента DBGrid сводятся к тому, что, поместив его на форму,
указывают связанный источник данных, после чего при помощи редактора
определяют состав и вид столбцов данных. В случае при необходимости так
же выставляют нужные значения для флагов в свойстве Options.
Компонент DBNavigator
Хотя в ряде случаев для обеспечения возможности навигации по
таблице достаточно использовать лишь стандартные средства, которыми
располагает
компонент
DBGrid,
в
ряде
случаев
бывает
полезным
предоставить пользователю более наглядный элемент управления для
навигации по данным и для их правки. Более того, подобный компонент
будет просто необходим, если для предоставления данных используется не
таблица, а набор отдельных элементов, отображающих данные из одного
конкретного поля.
Для этих целей предусмотрен специальный компонент - DBNavigator. С
его помощью можно перемещаться по записям таблицы а так же выполнять
операции типа вставки новой записи или подтверждения изменений. Внешне
он представляет собой панель со следующими 10 кнопками:

First - переход на первую запись в таблице;

Prior - переход на предыдущую запись;

Next - переход на следующую запись;

Last - переход на последнюю запись;

Insert - вставка новой записи перед текущей;

Delete - удаление текущей записи с переходом на следующую;

Edit - переводит источник данных в режим редактирования записи;

Post - запись измененных данных из текущей записи в БД;

Cancel - отмена изменений данных в текущей записи;

Refresh - обновление данных в буфере источника.
Часть этих кнопок можно отключить, воспользовавшись свойством
VisibleButtons. Еще одно свойство, влияющее на внешний вид компонента
DBNavigator - это Flat. Установив его в истину, можно придать панели
"плоский" вид. А при помощи свойства Hints можно задать пояснительный
текст всплывающей подсказки для каждой кнопки. Свойство - ConfirmDelete
определяет поведение этого компонента: если для него установлено значение
истины, то при попытке удаления записи (т.е. при нажатии на кнопку Delete)
будет выдаваться соответствующее предупреждение, свойство DataSource,
как и у всех других компонент представления данных БД, указывает на
источник данных, связанных с данным компонентом.
Для примера рассмотрим компонент навигации на форме с таблицей,
изображенной на рис. 3. Достаточно установить свойство DataSource
компонента DBNavigator в то же значение, что и у одноименного свойства
компонента DBGrid, чтобы получить связанно работающие компоненты.
Например, при редактировании записей в таблице, состояние кнопок в
навигационной панели будет изменяться в соответствии с возможными
действиями (рис. 3).
Рис. 3. Таблица DBGrid и панель навигации
Практическая часть
1. Откройте, ранее созданный проект.
2. На форму добавьте:
2.1. Из вкладки «ADO» на форму добавьте компонент
ADOTable и
настройте его свойства в соответствии с таблицей 2
Таблица 2 Свойства ADOTable
Свойство
Connection
TableName
Значение
Значение свойства Name компонента
ADOConnection
Выберите из выпадающего списка
table1
Active
true
2.2. Из вкладки «Data Access» на форму добавьте компонент
DataSource
и настройте его свойства в соответствии с таблицей 3
Таблица 3 Свойства DataSource
Свойство
DataSet
Значение
Значение свойства Name компонента
ADOTable
2.3. Из вкладки «Data Controls» на форму добавьте компонент
DBGrid и
настройте его свойства в соответствии с таблицей 4
Таблица 4 Свойства DBGrid
Свойства
Значение
DataSource
Значение свойства Name компонента
DataSource
2.4. Из вкладки «Data Controls» на форму добавьте компонент
DBNavigator и настройте его свойства в соответствии с таблицей 5
Таблица 5 Свойства DBNavigator
Свойства
Значение
DataSource
Значение свойства Name компонента
DataSource
3. Сохраните проект.
Download