Ревунков Г.И. - Методические указания к лабораторному практикуму по курсу «Базы данных» (1075664), страница 18
Текст из файла (страница 18)
Любые другие символы, указанные в строке Display Values, а также заключенные в апострофы или кавычки специальные символы-спецификаторы помещаются в выход¬ную строку без преобразования.
3.2.5.6. Поля для хранения значений произвольных форматов
Поле TBlobField предназначено для хранения больших двоичных объектов (BLOB -Binary Large Object).
Специфичные свойства:
property BlobSize: Integer;
Содержит текущее значение длины буфера в байтах, необходимого для размещения поля.
type TBIobType = (ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary) ;
property BlobType: TBIobType;
Определяет содержимое поля:
ftBlob - неотформатированные данные;
ftMemo - многострочный Jews;
ftGraphic - графическое изображение;
ftFmtMemo - многострочный текст в формате RTF;
ftParadoxOle - OLE-объект таблиц Paradox;
ftDBaseOle - OLE-объект таблиц dBASE;
ftTypedBinary - типизированные двоичные дан¬ные.
property IsNull: Boolean;
Содержит True, если поле пусто.
property Modified: Boolean;
Содержит True, если изменилось значение поля.
property Transliterate: Boolean;
Указывает, следует ли производить преобразование символов в кодировку ANSI при чтении строк из реальной ТБД и при записи строк обратно в ТБД в том случае, если строки в ТБД хранятся не в ANSI-колировке или содержат расширенные asch-символы.
property Value: String;
Используется для чтения/записи данных.
Специфичные методы:
procedure Assign(Source: TPersistent) ;
Загружает в поле значение поля Source другого НД.
procedure Clear;
Очищает поле.
procedure LoadFromFile(const FileName: Strings);
Загружает содержимое поля из файла.
procedure LoadFromStream (Stream: TStream) ;
Загружает содержимое поля из потока.
procedure SaveToFile(const FileName: String) ;
Сохраняет содержимое поля в файле
procedure SaveToStream(Stream: TStream);
Сохраняет содержимое поля в потоке.
Поле TVarBytesField содержит произвольное значение длиной до 65 535 байт. Текущая длина хранится в первых двух байтах и может быть получена с помощью свой¬ства DataSize.
Поле TGraphicField является частным случаем TBIobField и предназначено для хранения изображений.
3.3. РАБОТА С НАБОРАМИ ДАННЫХ В DELPHI
Как уже отмечалось выше, записи набора данных доступны для использования с помощью компонентов-источников данных TTable, TQuery или TStoredProc. Эти компоненты порождены от общего родительского класса TDBDataSet. Наиболее важные свойства, методы и события класса TDBDataSet приводятся в приложении.
3.3.1. Открытие и закрытие НД
Начальное состояние любого НД - dslnactive.
Чтобы открыть НД, используется метод Open или свойство Active, в которое нужно поместить значение True.
После успешного открытия НД переходит в состояние dsBrowse, а его курсор устанавливается на первую запись.
Чтобы закрыть НД, вызывается метод Close. Заметим, что, если НД закрывается, находясь в режимах dslnsert или dsEdit, изменения, сделанные в текущей записи, не запоминаются.
Перед вызовом Close рекомендуется вызвать CheckBrowseMode, чтобы гарантировать сохранение текущих изменений.
Закрыть НД можно также, поместив значение False в его свойство Active.
3.3.2. Программный доступ к записям
Для просмотра, вставки, редактирования и удаления записей обычно используются соответствующие визуальные компоненты - TDBGrid, TDBEdit, TDBNavigator и т. д., которые автоматически вызывают нужные методы НД.
Однако в ряде случаев необходим программный доступ к информации без использования визуальных компонентов.
При программном доступе прежде всего нужно убедиться в том, что НД содержит записи. Для этого нужно вызвать метод IsEmpty, который возвращает False, если в НД есть хотя бы одна запись.
После использования или редактирования текущей записи переход к следующей реализуется методами FindNext или Next.
Перед редактированием текущей записи набор данных необходимо перевести в состояние dsEdit методом Edit, а после редактирования сохранить сделанные изменения в соответствующей ТБД, вызвав метод Post.
По такой же схеме осуществляется вставка или добавление новой записи, при этом вмело Edit вызывается Insert (вставка записи) или Append (добавление записи).
Если НД не индексирован, вставленная запись помещается на место текущей записи, а текущая запись становится следующей за ней; добавленная запись помещается в конец НД.
Если НД индексирован, оба метода вставляют запись в позицию, определяемую текущим индексом.
Редактирование, удаление и вставка записей возможны только для НД, у которых свойство CanModify содержит значение True.
3.3.3. НАВИГАЦИЯ ПО НАБОРУ ДАННЫХ
Существует два способа работы с записями в НД.
Способ, основанный на использовании операторов SQL, предполагает оперировае группами записей. Именно так работают SQL-операторы группового обновления UPDATE, INSERT, DELETE и выборки групп записей SELECT.
Второй способ состоит в оперировании единичными записями. Если необходимо изменить, добавить или удалить группу записей, соответствующая операция выполняется для каждой из таких записей. Чтобы отыскать нужные записи в НД, применяются навигационне методы. Они всегда работают с единичной записью и связаны с понятием курсора НД.
Под курсором НД понимается указатель текущей записи в конкретном наборе данных.
С помощью методов First, Last, Next, Prior, MoveBy, FindFirst, FindLast, FindNext, 'ndPrior можно изменять положение курсора и, следовательно, выбирать нужную запись.
3.3.3.1. Последовательная навигация по записям
Для выполнения действий при последовательном переборе записей, начиная от некоторой стартовой записи и до конца набора данных, используют циклы while...do или repeat...until.
Если в ходе выполнения цикла последовательного перебора записей изменится ключевое в поле записи или в НД, будет вставлена новая (удалена старая) запись, курсор НД может изменить свое положение и правильная работа цикла будет нарушена.
3.3.3.2. Использование закладок
В НД можно осуществить для записи действия аналогичные закладкам в книге.
Для этой цели НД обладает следующими методами:
• GetBookmark -создает закладку.
• GotoBookmark -перемещает курсор к закладке.
• FreeBookmark -удаляет закладку.
• BookmarkValid -проверяет закладку.
• CompareBookmarks (сравнивает две закладки).
3.3.4. ПОИСК ЗАПИСЕЙ В НАБОРАХ ДАННЫХ
3.3.4.1. Метод Locate
function Locate(const KeyFields: String; const KeyValues: Variants-Options: TLocateOptions): Boolean;
Метод Locate ищет первую запись, удовлетворяющую критерию поиска, и, если такая запись найдена, делает ее текущей. В этом случае в качестве результата возвращается True. Если запись не найдена, возвращается False.
Список KeyFields указывает поле или несколько полей, по которым ведется поиск.
В случае нескольких поисковых полей их названия разделяются точкой с запятой.
Критерии поиска задаются в вариантном массиве KeyValues так, что i'-е значение в KeyValues ставится в соответствие i-му полю в KeyFields.
Options позволяет указать необязательные значения режимов поиска:
• loCaselnsensitive- поиск ведется без учета высоты букв.
• loPartialKey - запись считается удовлетворяющей условию поиска, если она содержит часть поискового контекста.
Locate производит поиск по любому полю.
Поле или поля, по которым производится поиск, могут не только не входить в текущий индекс, но и не быть индексными вообще.
В случае если поля поиска входят в какой-либо индекс, Locate использует этот индекс при поиске.
Если искомые поля входят в несколько индексов, трудно сказать, какой из них будет использован. Соответственно, трудно предсказать, какая запись из множества записей, удовлетворяющих критерию поиска, будет сделана текущей -особенно в случае если поиск ведется не по текущему индексу.
При поиске по полям, не входящим ни в один индекс, применяются фильтры BDE.
3.3.4.2. Метод Lookup
function Lookup(const KeyFields: String; const KeyValues: Variant;
const ResultFields: String): Variant;
Метод Lookup находит запись, удовлетворяющую условию, но не делает ее текущей, а возвращает значения некоторых полей этой записи. Независимо от успеха поиска записи указатель текущей записи в НД не изменяется.
В отличие от Locate Lookup осуществляет поиск только на точное соответствие критерия поиска и значения полей записи.
В KeyFields указывается список полей, по которым необходимо осуществить поиск. При наличии в этом списке более чем одного поля, соседние поля разделяются точкой с запятой.
KeyValues указывает поисковые значения полей, список которых содержится в KeyFields.
Если имеется несколько поисковых полей, каждому i-му полю в списке KeyFields ставится в соответствие i-е значение в списке KeyValues.
При наличии одного поля его поисковое значение можно указывать в качестве KeyValues непосредственно.
B случае нескольких полей их необходимо приводить к типу вариантного массива при помощи VarArrayOf.
В качестве поисковых полей можно указывать поля как входящие в какой-либо индекс, так и не входящие в него; тип текущего индекса не имеет значения.
Если поисковые поля входят в какие-либо индексы, их использование производится автоматически; в противном случае используются фильтры BDE.
Если в результате поиска запись не найдена, метод Lookup возвращает Null, что можно проверить с помощью оператора:
if VarType(LookupResults) = varNull then ...
В противном случае Lookup возвращает из этой записи значения полей, список которых содержит ResultFields. При этом размерность результата зависит от того, сколько результирующих полей указано в ResultFields:
• одно поле - результатом будет значение соответствующего типа или Null.
• несколько полей - результатом будет вариантный массив.
3.3.5. Фильтрация записей
3.3.5.1. Свойство Filter
Свойство Filter позволяет задать критерий фильтрации.
В этом случае НД будет отфильтрован, как только его свойство Filtered станет равным True.
Синтаксис описания критерия похож на синтаксис секции WHERE SQL-запроса, с тем исключением, что имена переменных программы указывать нельзя. Можно указывать имена полей и литералы (явно заданные значения). Можно использовать обычные операции отношения и логические операторы AND, NOT и OR, например.
Строку критерия фильтрации можно ввести во время прогона программы или на этапе конструирования формы. Например, с помощью обработчика события OnChecked компонента ComboBoxl (критерий фильтрации) считывается из редактора Editi и помещается в свойство Filter компонента Tablel .
Можно определить дополнительные условия фильтрации строковых полей:
• foCaseInsensitive - фильтрация производится без учета разницы в высоте букв;
• foNoPartialCompare - поиск производится на точное соответствие.
Помимо описываемых средств для фильтрации данных могут использоваться методы SetRange, ApplyRange (и сопутствующие им методы) в компоненте TTable и секция WHERE SQL-запроса в компонентах TQuery и TStoredProc.
3.3.5.2. Событие OnFilterRecord
Событие OnFilterRecord возникает при установке значения True в свойство Filtered.
Обработчик события имеет два параметра: имя фильтруемого набора данных и переменную Accept, в которую программа должна поместить True, если текущая запись удовлетворяет критерию фильтрации.
В отличие от критерия в строке Filtered, ограниченного рамками синтаксиса условного выражения, критерий, реализуемый в обработчике события OnFilterRecord, определяется синтаксисом Object Pascal и может реализовывать сложные алгоритмы фильтрации. Однако следует помнить о том, что в обработчике OnFilterRecord последовательно перебираются все записи ТБД, в то время как методы SetRange, ApplyRange и им сопутствующие методы компонента ТТаЫе используют индексно-последовательный метод доступа(т. е. работают с частью записей в физической ТБД). Это делает использование обработчика OnFilterRecord предпочтительным для фильтрации небольших объемов записей и сильно ограничивает его применение при больших объемах.
Kогда приложение обрабатывает событие OnFilterRecord, НД переводится из состояния dsBrowse в состояние dsFilter. Это предотвращает модификацию НД во время фильтрации.
После завершения текущего вызова обработчика события OnFilterRecord набор данных переводится в состояние dsBrowse.
3.3.6. БЛОКИРОВКА ТАБЛИЦ В МНОГОПОЛЬЗОВАТЕЛЬСКОМ РЕЖИМЕ
При работе с таблицами локальных СУБД в многопользовательском режиме может возникнуть ситуация, когда на момент внесения изменений в какую-либо таблицу одним пользователем необходимо блокировать внесение изменений в эту же таблицу со стороны других пользователей.
Более жестким ограничением может служить запрет на просмотр содержимого таблицы со стороны других пользователей.