Лекция 5.5. Набор данных
Набор данных (НД) можно представить как двумерную таблицу. Строки таблицы принято называть записями, а столбцы – полями.
Таблицы БД не загружаются в память полностью в виду их большого размера.
В память загружаются только значения текущей записи. Перемещение по НД заключается в последовательной загрузке в память значений записей.Текущую запись принято называть курсором НД. Курсор НД представляет собой объект, содержащий значения текущей записи и имеет необходимые методы для работы с ней.
Общим предком всех НД в Delphi является класс TDataSet, он определяет базовые возможности наследников. На основе класса TDataSet разработано много компонентов-потомков для работы с БД таких как TTable и TQuery (BDE), TADOTable и TADOQuery (ADO), TIBTable и TIBQuery (Interbase) и многих других.
Все вышеперечисленные компоненты условно можно подразделить на две группы:
· TTable, TADOTable, TIBTable – компоненты навигационного доступа к данным, т.е прямое обращение к таблице, перемещение по записям (навигация) и т.д.;
· TQuery, TADOQuery, TIBQuery – компоненты для реляционного доступа к данным основанных на SQL-запросах.
В данном курсе лекций, традиционно, будут рассматриваться только некоторые средства доступа к БД на основе BDE и ADO.
Для понимания наиболее общих возможностей потомков рассмотрим базовый класс TDataSet. Основные свойства класса TDataSet:
· Active: Boolean – определяет открыт (true) или нет (false) НД;
· Bof: Boolean – определяет находится ли курсор в первой записи (true);
· CanModify: Boolean – определяет возможность редактирования текущей записи;
· Eof: Boolean – определяет находится ли курсор в последней записи (true);
· FieldCount: Integer – количество полей в НД;
· Fields: [Index: Integer]: TField – список полей НД и их свойств;
· Filter: string – определяет условие фильтрации. В условии можно использовать сравнения (, =, =, ), логические (and, or, not) и арифметические (+, -, *, /) операции;
· Filtered: Boolean – включает (true) или выключает (false) фильтр;
· FilterOptions: TFilterOptions = set of [foCaseInsensitive, foNoPartialCompare] – определяет параметры фильтрации:
ü foCaseInsensitive – фильтр не чувствителен к регистру;
ü foNoPartialCompare – фильтр по полному совпадению.
· Modified: Boolean – определяет была ли изменена текущая запись;
· RecNo: Integer – номер текущей записи в НД (положение курсора);
· RecordCount: Integer – количество записей в НД;
· State: TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc, dsOpening); – определяет состояние НД (думаю, что основные состояния вам будут понятны);
Основные методы класса:
· Функции FindFirst, FindLast, FindNext, FindPrior – обеспечивают переход по записям, удовлетворяющим условиям фильтра, при выключенной фильтрации;
· function FieldByName(const FieldName: string): TField – возвращает поле по имени;
· function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean – ищет записи со значениями KeyValues по полям KeyFields. Устанавливает указатель на первую найденную запись;
· function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: String): Variant – тоже, что и Locate, но поиск производится по точному совпадению а результат поиска возвращается вариантным массивом. Состав возвращаемых значений полей указывается параметром ResultFields;
· procedure Append – создает пустую запись и переводит ее в режим вставки;
· procedure AppendRecord(const Values: array of const) – тоже, но позволяет задать значения;
· procedure Cancel – отменяет текущие изменения внесенные в запись;
· procedure Close – выключает НД;
· procedure Delete – удаляет текущую запись;
· procedure Edit – переводит текущую запись в режим редактирования;
· procedure First – перемещает курсор на первую запись;
· procedure GetFieldNames(List: TStrings) – возвращает список имен полей НД;
· procedure Insert – создает пустую запись и переводит ее в режим вставки;
· procedure InsertRecord(const Values: array of const) - тоже, но позволяет задать значения;
· procedure Last – перемещает курсор на последнюю запись;
· procedure Next – перемещает курсор на следующую запись;
· procedure Open – включает НД;
· procedure Post – сохраняет изменения внесенные в режиме вставки или редактирования в БД;
· procedure Prior – перемещает курсор на предыдущую запись;
В классе TDataSet определен целый ряд событий, связанных с изменением состояния НД. Все события класса можно условно разделить на три группы:
· события, возникающие перед изменением состояния НД;
· события, возникающие после изменения состояния НД;
· события, возникающие в момент изменения состояния НД;
События, возникающие перед изменением состояния НД, определяются словом Before, а возникающие после изменения определяются словом After.
Например, при открытии НД (действие Open) возникают события BeforeOpen и AfterOpen. Для упрощения опишем только действия, для которых имеются события возникающие перед- и после него:· Cancel – отмена изменений, внесенных в НД;
· Close – закрытие НД;
· Delete – удаление текущей записи;
· Edit – переход в режим редактирования;
· Insert – переход в режим вставки;
· Open – открытие НД;
· Post – сохранение изменений в БД;
· Scroll – изменение позиции курсора.
Из третьей группы рассмотрим только два события:
· OnCalcFields – возникает при перечете вычисляемых полей;
· OnNewRecord – возникает при добавлении новой записи;
Объект Поле
Доступ к значениям записи НД осуществляется через интерфейс свойства Fields класса TFields. Свойство Fields[Index: Integer]: TField можно представить как массив полей. Каждый объект класса TField имеет свойства для работы с данным полем и его значениями.
При работе со значениями полей БД приходится выполнять согласование типов этих значений с типами принятыми в Delphi. Для этих целей используется набор свойств согласования типов, которые условно можно обозначить как AsXXXX, где XXXX есть: Boolean, Currency, DateTime, Float, Integer, String, Variant и т.д. Например, AsString – значение является строкой.
Рассмотрим несколько основных свойств класса TField:
· DataType: TFieldType – тип данных хранящихся в поле;
· DisplayLabel: String – подпись поля;
· FieldName: String – имя поля с которым связан объект;
· IsNull: Boolean – определяет, содержит поле значение (false) или нет (true);
· Text: string – значение поля в виде строки;
· Value: Variant – значение поля (но обычно пользуются AsXXXX);
Рассмотрим наиболее общие примеры применимые ко всем НД.
Пример получения значения поля текущей записи произвольного НД на примере компонента класса TTable (особенности класса TTable будут рассмотрены в следующей теме):
FIO:= Table1.Fields[1].AsString; //по номеру поля
FIO:= Table1.FieldByName(‘FIO’).AsString; //по имени поля
При необходимости считать все значения поля в список можно использовать следующий код:
Table1.First; // перемещаем курсор на первую запись
while not Eof do // повторяем пока не достигнут конец НД
begin
ListBox1.Items.Add(Table1.FieldByName(‘FIO’).AsString);
Table1.Next; // переводим курсор на следующую запись
end;
или:
with Table1 do
for i:= 1 to RecordCount do
begin
RecNo:= i;
ListBox1.Items.Add(Fields[1].AsString);
end;
Пример редактирования текущей записи поля «ФИО» таблицы БД:
Table1.Edit; // переводим НД в режим редактирования
Table1.FieldByName(‘FIO’).AsString:= ‘Калимуллин А.Н.’; //присваиваем новое значение
Table1.Post; // применяем сделанные изменения
Поиск и фильтрация по набору данных
Приведем пример использования фильтрации на примере класса TTable (функция QuotedStr добавляет кавычки к аргументу):
with Table1 do
begin
Filtered:= false; // отключаем фильтрацию, если она была включена
Filter:= 'FIO = ' + QuotedStr (Edit1.Text + '*'); // задаем условие фильтрации
FilterOptions:= [foCaseInsensitive]; // определяем параметры
//фильтрации (недоступно для ADO)
Filtered:= true; // включаем фильтрацию
end;
Следующие пример демонстрирует способ поиска по НД с использованием метода Locate:
if not Table1.Locate(‘Category;Color’, VarArrayOf([‘Дверь’, ‘Белая’]), [loCaseInsensitive, loPartialKey]) then ShowMessage(‘Объект не найден’);
Вопросы для самоконтроля
1.
Что такое набор данных?2. Какую роль играет курсор НД?
3. На основе какого базового класса реализуется НД?
4. Какие компоненты реализуются на основе класса TDataSet?
5. Назовите свойства для определения положения курсора НД.
6. Как определить количество полей и записей НД?
7. Как определить текущее состояние НД?
8. Как осуществляется изменение данных в НД?
9. Как выполняется фильтрация по НД?
10. Какими средствами выполняется поиск по НД?
Еще по теме Лекция 5.5. Набор данных:
- Лекция 5. Стратегии и методы менеджмента риска.
- Лекция 9. Оценка бизнеса в условиях неопределенности и риска.
- Лекция 11. Информационная безопасность предприятия.
- Лекция 9. Оценка бизнеса в условиях неопределенности и риска.
- В лекции исследуются криминалистическая характеристика мошеннических действий, совершаемых в отношении юридических лиц, освещаются организационные и тактическое аспекты раскрытия и расследования данной категории уголовных дел, а также уделяется внимание производству отдельных следственных действий, проводимых на первоначальном и последующем этапах расследования данных преступлений.
- В лекции исследуются криминалистическая характеристика мошеннических действий, совершаемых в отношении физических лиц, освещаются организационные и тактическое аспекты раскрытия и расследования данной категории уголовных дел, а также уделяется внимание производству отдельных следственных действий, проводимых на первоначальном и последующем этапах расследования данных преступлений.
- В лекции исследуется криминалистическая характеристика преступлений в топливно-энергетическом комплексе, освещаются организационные и тактическое аспекты раскрытия и расследования данной категории уголовных дел, а также уделяется внимание производству отдельных следственных действий, проводимых на первоначальном и последующем этапах расследования данных преступлений.
- 6. Основные архитектуры баз данных
- 10. Современные программы статистической обработки данных
- Лейкоцитозы и лейкопении (Лекция № XIX).
- Патофизиология нервной системы. Гиперкинезы (Лекция № XXXI).
- Патофизиология почек (Лекция № XXIX).