с реляционными базами данных 6 глава

.


Глава 4. Разработка сотворения информационной системы


79


Ниже приводится пример кода, в каком осуществляется воззвание к компо­нентам модуля данных.

procedure TForml.FormCreate(Sender: TObject);

begin

DataModule2.Tablel.DatabaseName := 'dbdemos';

DataModule2.Tablel.TableName := 'Clients.dbf;

DataModule2.DataSourcel.DataSet := DataModule2.Tablel;

DBGridl.DataSource : = DataModule2.DataSourcel;

DBNavigatorl.DataSource := DataModule2.DataSourcel;

DataModule2.Tablel.Active := True;

end;

Для компонент с реляционными базами данных 6 глава инсталлируются значения параметров, связывающих меж собой эти составляющие и таблицу БД. Значения параметров инсталлируются динамически в процессе выполнения приложения, зачем применен обработчик действия сотворения главной формы приложения. В составных именах компонент досту­па к данным, которыми являются источник данных DataSourcel и набор дан­ных Tablel, указывается имя модуля с реляционными базами данных 6 глава данных DataModuie2.

Чтоб обеспечить возможность доступа к компонентам модуля данных в модуле формы, в перечень uses раздела implementation нужно включить ссылку на модуль данных:

uses unit2;

Ссылку на другой модуль можно написать без помощи других, но Delphi позволяет воткнуть ее автоматом. При выборе команды File\Use Unitвозникает диа­логовое с реляционными базами данных 6 глава окно Use Unit.После выбора подходящего модуля и нажатия кнопки ОК он добавляется в перечень.


Рис. 4.21. Диалоговое окно Information

Если ссылка на требуемый модуль отсутствует, но в коде употребляется имя мо­дуля данных, то при компиляции приложения возникает диалоговое окно Information(рис. 4.21). Оно докладывает, что форма ссылается на другую с реляционными базами данных 6 глава форму, объявленную в модуле, отсутствующем в перечне uses формы. Для автомати­ческого прибавления модуля в перечень довольно надавить кнопку Yes.


80


Часть I. Базы работы с базами данных


Кроме компонент доступа к данным, которыми являются session,

Database, Table, Query, StoredProc, BatchMove И др., В модуле данных МОЖНО располагать невизуальные составляющие, не имеющие с реляционными базами данных 6 глава непосредственного отношения к БД, к примеру, ImageList, OpenDialog Либо Timer.

(____ ЗамечаниеJ

При работе с модулем данных в Гамме компонент доступны только невизуаль­ные составляющие.

Модуль данных позволяет:

□ отделить управление БД от обработки данных;

□ сделать модуль, вместе применяемый несколькими приложениями.

Главным предназначением модуля данных является централизованное хранение компонент доступа к данным с реляционными базами данных 6 глава, также кода для этих компонент, в частно­сти, обработчиков событий. В модуле данных комфортно располагать код, выпол­няющий управление БД, к примеру, реализацию бизнес-правил.

Внедрение обычного модуля данных несколькими приложениями позволяет ускорить разработку приложений, т. к. готовый модуль данных потом можно включать в новые приложения. Не считая того с реляционными базами данных 6 глава, управление БД через общий модуль дает возможность найти для всех юзеров схожие режи­мы и правила работы с базой, также делает более обычным изменение этих режимов и правил.

Но для маленьких приложений внедрение обычного модуля данных не всегда оправданно, т. к. может затруднить, а не облегчить разработку приложения.

Удаленный с реляционными базами данных 6 глава модуль данных предназначен для работы с удаленными БД в трех­уровневой архитектуре "клиент-сервер" и употребляется для сотворения сервера при­ложения — промежного уровня меж приложением и сервером БД.

Web-модуль предназначен для работы с БД в сети Веб и является посред­ником меж обозревателем (программкой просмотра Web-документов) и серве­ром с реляционными базами данных 6 глава БД. Внедрение Web-модуля рассмотрено в главе 20, посвященной пуб­ликации баз данных средствами Delphi.



Глава 5


Компонентыдоступакданным

Составляющие доступа к данным являются невизуальными. В этой главе мы рас­смотрим главные составляющие доступа к данным, которые применяются при работе с локальными и удаленными БД при помощи механизма BDE. Компонен­ты с реляционными базами данных 6 глава Session и Database, используемые для управления соединениями с БД и транзакциями, будут исследованы в главах 7 и 13.

Наборы данных

Таблицы БД размещаются на диске и являются физическими объектами. Для операций с данными, содержащимися в таблицах, употребляются наборы данных. В определениях системы Delphi набор данных представляет собой совокупа запи­сей, взятых из с реляционными базами данных 6 глава одной либо нескольких таблиц БД. Записи, входящие в набор дан­ных, отбираются по определенным правилам, при всем этом в личных случаях набор данных может включать в себя все записи из связанной с ним таблицы либо не содержать ни одной записи. Набор данных является логической таблицей, с которой можно работать при выполнении с реляционными базами данных 6 глава приложения. Взаимодействие таб­лицы и набора данных припоминает взаимодействие физического файла и фай­ловой переменной.

(_____ Замечание

В отличие от Delphi, многие СУБД заместо термина набор данных употребляют терми­ны подборка либо таблица.

В Delphi для работы с наборами данных при использовании механизма BDE служат такие составляющие, как с реляционными базами данных 6 глава Table, Query, UpdateSQL, DecisionQuery либо storedProc. В случае других устройств доступа для работы с наборами дан­ных служат подобные составляющие ADOTable, ADOQuery и ADOStoredProc (для механизма ADO), SQLTable, SQLQuery и SQLStoredProc (для механизма dbExpress), iBTable, iBQuery, iBUpdateSQL и iBStoredProc (для механизма InterBease). Отличительные особенности последних мы разглядим при описа­нии соответственных с реляционными базами данных 6 глава устройств доступа. Тут остановимся на исследовании компонент для механизма доступа BDE.


82


Часть I. Базы работы с базами данных


Компонент storedProc употребляется для вызова хранимых процедур при организации взаимодействия с удаленными БД, а компонент UpdateSQL обеспечивает работу с котированными переменами в записях. Эти составляющие рассматриваются при описании удаленных БД. Компонент с реляционными базами данных 6 глава DecisionQuery используется при построении систем принятия решений. Более универсальными и, соответственно, нередко применяемыми являются составляющие Table и Query, задающие наборы данных. Они будут тщательно

ШШШ^ МбзЖйнй4тиедоступа к БД обеспечивает класс TDataSet, представ­ляющий наборы данных в виде совокупы строк и столбцов (записей и по­лей). Этот класс содержит главные средства с реляционными базами данных 6 глава навигации (перемещения) и ре­дактирования наборов данных.

Составляющие Table и Query являются производными от класса TDBDataSet — потомка класса TDataSet (через класс TBDEDataSet). Они показывают схо­жие с базисными классами свойства и поведение, но любой из их имеет и свои особенности. Тут мы разглядим более общие свойства на с реляционными базами данных 6 глава­боров данных. Большая часть параметров, способов и событий изучается на примере операций с наборами данных.

Размещение БД, с таблицами которой производятся операции, показывает свойство DatabaseName типа string. Значением характеристики является имя катало­га, в каком находится БД (файлы ее таблиц), либо псевдоним, ссылающийся на этот каталог. Если для БД определен псевдоним с реляционными базами данных 6 глава, то его можно избрать в раскрывающемся перечне окна Инспектора объектов.

(_____ ЗамечаниеJ

Лучше задавать имя БД через псевдоним. Это приметно упрощает перенос приложения и файлов БД в другие сборники и на другие компы, т. к. для обес­печения работоспособности приложения после конфигурации расположения БД доста­точно поменять заглавие каталога с реляционными базами данных 6 глава, на который ссылается псевдоним БД.

Для компонента Table внедрение характеристики DatabaseName является единст­венной возможностью задать местопребывание таблиц БД. Для компонента Query дополнительно можно указать в запросе SQL путь доступа к каждой таблице.

(_____ ЗамечаниеJ

При задании расположения БД программным методом набор данных предвари­тельно нужно закрыть, установив его свойство Active в значение False с реляционными базами данных 6 глава. В неприятном случае генерируется исключение.

Вот вам наглядный пример, иллюстрирующий, как задается размещение БД:

Tablel.Active := False;

Tablel.DatabaseName : = 'BDPlace';

Table2.Active := False;

Table2.DatabaseName : = 'C:\SALE\BD';


Глава 5. Составляющие доступа к данным


83


Для набора данных Tablel таблицы БД размещены в каталоге, на который показывает псевдоним BDPlace с реляционными базами данных 6 глава. Таблицы БД для набора данных ТаЫе2 распо­ложены в каталоге C:\SALE\BD. Для определения и конфигурации псевдонима и его характеристик комфортно использовать такие программки, как Database Desktop либо BDE Administrator (рассматриваются в главе 12).

Зависимо от ограничений и аспекта фильтрации один и тот же набор данных в различные моменты времени может содержать с реляционными базами данных 6 глава разные записи. Число записей, составляющих набор данных, определяет свойство RecordCount типа Longint. Это свойство доступно для чтения при выполнении приложения. Управление числом записей в наборе данных осуществляется косвенно — методом отбора записей тем либо другим методом, к примеру, при помощи фильтрации либо SQL-запроса (для компонента Query).

В с реляционными базами данных 6 глава приводимом примере делается перебор всех записей набора данных:

var i: integer;

Tablel.First;

for i := 1 to Tablel.RecordCount do begin

// Тут можно расположить аннотации, выполняющие

// обработку очередной записи

Table1.Next;

end;

Перебор всех записей набора данных осуществляется в цикле, зачем перемен­ная i цикла поочередно воспринимает значения от 1 до RecordCount. До цикла с реляционными базами данных 6 глава вызовом способа First производится переход к первой записи на­бора данных. В цикле для перехода к последующей записи вызывается способ Next.

Для локальных таблиц dBase либо Paradox составляющие набор данных записи поочередно нумеруются, отсчет начинается с единицы. Номер записи в наборе данных определяет свойство RecNo типа Longint, которое доступно во время с реляционными базами данных 6 глава выполнения программки.

Номер текущей записи можно выяснить, к примеру, так:

Editl.Text := IntToStr(Tablel.RecNo);

(_____ ЗамечаниеJ

При изменении порядка записей при сортировке либо фильтрации нумерация запи­сей также меняется.

Для таблиц Paradox свойство RecNo можно использовать для перехода к требуемой записи, установив в качестве значения характеристики номер записи. Так, в с реляционными базами данных 6 глава операции

Tablel.RecNo := StrToInt(Editl.Text);

производится переход к записи, номер которой содержится в поле ввода Editl. Обозначенная запись становится текущей.


84


Часть I. Базы работы с базами данных


Для выполнения операций с наборами данных употребляются два метода досту­па к данным:

□ навигационный; □ реляционный.

Навигационный метод доступа заключается в обработке с реляционными базами данных 6 глава каждой отдельной за­писи набора данных. Этот метод обычно употребляется в локальных БД либо в удаленных БД маленького размера. При навигационном методе доступа каждый набор данных имеет невидимый указатель текущей записи. Указатель определя­ет запись, с которой могут производиться такие операции, как редактирование либо удаление. Поля текущей записи доступны для просмотра с реляционными базами данных 6 глава. К примеру, ком­поненты DBEdit и DBText показывают содержимое соответственных полей конкретно текущей записи. Компонент DBGrid показывает текущую запись с помо­щью специального маркера.

В разрабатываемом приложении навигационный метод доступа к данным мож­но воплотить, используя хоть какой из компонент Table либо Query.

Реляционный метод доступа основан на обработке с реляционными базами данных 6 глава группы записей. Если требу­ется обработать одну запись, все равно обрабатывается группа, состоящая из одной записи. При реляционном методе доступа употребляются SQL-запросы, потому его именуют также SQL-ориентированным. Реляционный метод досту­па нацелен на работу с удаленными БД и является для их предпочти­тельным. Но с реляционными базами данных 6 глава его можно использовать и для локальных БД.

Реляционный метод доступа к данным в приложении можно воплотить с по­мощью компонента Query.

Состояния наборов данных

Наборы данных могут находиться в открытом либо закрытом состояниях, на что показывает свойство Active типа Boolean. Если свойству Active установлено значение True, то набор данных открыт. Открытый компонент с реляционными базами данных 6 глава Table содержит набор данных, соответственный данным таблицы, связанной с ним через свой­ство TableName. Для открытого компонента Query набор данных соответствует результатам выполнения SQL-запроса, содержащегося в свойстве SQL этого компонента. Если свойство Active имеет значение False (по дефлоту), то набор данных закрыт, и его связь с БД разорвана с реляционными базами данных 6 глава.

Набор данных может быть открыт на шаге разработки приложения. Если при всем этом к набору данных через источник данных DataSource подключены визу­альные составляющие, к примеру, DBGrid либо DBEdit, то они показывают соот­ветствующие данные таблицы БД.

(_____ ЗамечаниеJ

На шаге проектирования приложения зрительные составляющие показывают данные записей набора данных, но перемещение с реляционными базами данных 6 глава по набору данных и редактирование запи­сей невозможны. Исключение составляет возможность перемещения текущего ука­зателя при помощи полос прокрутки компонента DBGrid.


Глава 5. Составляющие доступа к данным


85


Если по любым причинам открыть набор данных нереально, то при по­пытке установить свойство Active в значение True выдается сообщение об ошибке, а с реляционными базами данных 6 глава свойство Active сохраняет значение False. Одной из обстоятельств невоз­можности открытия набора данных может являться неверное значение характеристики TableName либо SQL.

(_____ ЗамечаниеJ

На шаге проектирования свойство Active наборов данных автоматом уста­навливается в значение False при изменении значения параметров DataBaseName,

TableName либо SQL.

Приводимый пример показывает управление состоянием набора с реляционными базами данных 6 глава данных при помощи характеристики Active, которое употребляется для открытия и закрытия на­бора данных Queryl:

procedure TForml.ButtonlClick(Sender: TObject);

begin

Queryl.Active := False;

Queryl.SQL.Clear;

Queryl.SQL.Add('select * from Example1.db');

Queryl.Active := True;

end;

Управлять состоянием набора данных можно также при помощи способов Open и с реляционными базами данных 6 глава Close.

Процедура Open открывает набор данных, ее вызов эквивалентен установке характеристики Active в значение True. При вызове способа Open генерируются собы­тия BeforeOpen и AfterOpen, также вызываются процедуры-обработчики этих событий.

Процедура close закрывает набор данных, ее вызов эквивалентен установке характеристики Active в значение False. При вызове способа close генерируются со с реляционными базами данных 6 глава­бытия BeforeClose и AfterClose, также вызываются процедуры-обработчики этих событий.

В примере показывается управление состоянием набора данных (открытие и закрытие) при помощи способов Open и close:

procedure TForml.Button2Click(Sender: TObject);

begin

Queryl.Close;

Queryl.SQL.Clear;

Queryl.SQL.Add('select * from Example2.db');

Queryl.Open;

end с реляционными базами данных 6 глава;


86


Часть I. Базы работы с базами данных


Действия BeforeOpen и AfterOpen имеют тип TDataSetNotifyEvent, который описывается так:

type TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;

В этом описании параметр DataSet определяет набор данных, для которого вышло событие.

Событие BeforeOpen появляется конкретно перед открытием набора дан­ных. В обработчике этого действия можно выполнить с реляционными базами данных 6 глава проверку определенных критерий, и если они не соблюдаются, то открытие набора данных может быть запрещено.

(Замечание^

Обработчик действия не содержит специального параметра, при помощи которого можно запретить открытие набора данных. Одним из вариантов запрета открытия является принудительное возбуждение исключения.

Разглядим в качестве примера последующую функцию:

procedure TForial.TablelBeforeOpen с реляционными базами данных 6 глава(DataSet: TDataSet);

begin

if not CheckBoxl.Checked then Abort;

end;

Если флаг CheckBoxl, управляющий возможностью открытия набора данных, не установлен, то открытие набора данных Tablel блокируется. Для этого при помощи вызова процедуры Abort генерируется "тихое" исключение. В резуль­тате операции, связанные с открытием набора данных, отменяются, а пользова­телю не выдается никаких сообщений с реляционными базами данных 6 глава об ошибках. В схожих случаях выдачу предупреждающих сообщений должен обеспечивать программер, как это реа­лизуется, к примеру, в приведенной ниже процедуре:

procedure TFo rial.TablelBeforeOpen(DataSet: TDataSet);

begin

if not CheckBoxl.Checked then begin MessageDlg ('Данные таблицы ' + Tablel .TableName + ' недосягаемы!',

mtError, [mbOK], Ob-Abort; end;

end;

Событие AfterOpen генерируется сходу с реляционными базами данных 6 глава после открытия набора данных. Это событие можно использовать, к примеру, для выдачи юзеру сообщения о способности работы с данными.


Глава 5. Составляющие доступа к данным


87


В примере показывается открытие набора данных с выдачей соответствую­щего сообщения:

procedure TForml.TablelAfterOpen(DataSet: TDataSet);

begin

if CheckBox2.Checked then

MessageDlg('Данные таблицы ' + Table1.TableName + ' доступны для с реляционными базами данных 6 глава работы.',

mtWarning, [mbOK], 0);

end;

Если флаг checkBox2, управляющий возможностью выдачи сообщений, уста­новлен, то при открытии набора данных Tabiei юзеру выдается сооб­щение.

Как уже говорилось, при закрытии набора данных появляются действия Bef oreClose

и AfterClose. Они, как и действия BeforeOpen и AfterOpen, имеют тип TDataSetNotifyEvent.

Отметим, что закрытие набора с реляционными базами данных 6 глава данных автоматом не сохраняет текущую запись, т. е. если набор данных при закрытии находился в режимах редактиро­вания либо вставки, то произведенные конфигурации данных в текущей записи бу­дут потеряны. Потому перед закрытием набора данных необходимо инспектировать его режим и по мере надобности принудительно вызывать способ Post с реляционными базами данных 6 глава, сохраняющий изготовленные конфигурации. Одним из вариантов сохранения конфигураций является вызов способа Post в обработчике действия BeforeClose, возникающего непосредст­венно перед закрытием набора данных.

Разглядим последующий пример:

procedure TForml.TablelBeforeClose(DataSet: TDataSet);

begin

if (Tablel.State = dsEdit) or (Tablel.State = dslnsert) then Tablel.Post;

end;

Если набор данных Tablel находится в режиме редактирования с реляционными базами данных 6 глава либо вставки, то перед его закрытием внесенные конфигурации сохраняются.

СЗамечание^

При закрытии приложения событие BeforeClose не генерируется, и несохранен-ные конфигурации теряются.

Событие AfterClose появляется сходу после закрытия набора данных, и его можно использовать для выдачи юзеру соответственных сообщений, как это изготовлено в приведенной ниже процедуре:

procedure с реляционными базами данных 6 глава TForml.TablelAfterClose(DataSet: TDataSet);

begin

if CheckBox2.Checked then begin


88


Часть I. Базы работы с базами данных


Веер;

MessageDlg('Таблица ' + Tablel.TableName + ' закрыта.',

mtWarning, [mbOK], 0) ; end; end;

Если установлен флаг checkBox2, управляющий режимом выдачи сообщений, то после закрытия набора данных Tabiei выдается сообщение о закрытии таб­лицы, связанной с этим набором данных с реляционными базами данных 6 глава.

Нужно подразумевать, что если при работе приложения употребляется боль­шое число таблиц, то выдача схожих сообщений может затруднять деяния юзера. Потому программер должен предугадать возможность отклю­чения выдачи сообщений. В приведенных примерах для этой цели предназначен флаг CheckBox2.

Режимы наборов данных

Наборы данных могут находиться в разных режимах. Текущий с реляционными базами данных 6 глава режим набора данных определяется свойством State типа TDataSetState. Оно доступно для чтения во время выполнения приложения и может быть применено только для текущего режима. Для перевода набора данных в требуемый режим исполь­зуются особые способы. Они могут вызываться очевидно (указанием имени ме­тода) либо косвенно (методом управления надлежащими зрительными компо­нентами с реляционными базами данных 6 глава, к примеру, навигатором DBNavigator либо сетью DBGrid).

Набор данных может находиться в одном из перечисленных ниже режимов.

□ dsinactive (неактивен) — набор данных закрыт и доступ к его данным не­возможен. В этот режим набор данных перебегает после собственного закрытия, ко­гда свойство Active установлено в значение False.

□ dsBrowse с реляционными базами данных 6 глава (навигация по записям набора данных и просмотр данных) — в этот режим набор данных перебегает так:

• из режима dsinactive — при установке характеристики Active в значение True;

• из режима dsEdit — при вызове способа Post либо Cancel;

• из режима ds Ins ert — при вызове способа Post либо Cancel.

□ dsEdit (редактирование текущей записи) — в с реляционными базами данных 6 глава этот режим набор данных пе­реходит из режима dsBrowse при вызове способа Edit.

□ dsinsert (вставка новейшей записи) — в этот режим набор данных перебегает из режима dsBrowse при вызове способов Insert, insertRecord, Append либо AppendRecord.

□ dsSetKey (поиск записи, удовлетворяющей данному аспекту) — в этот режим набор данных перебегает из режима dsBrowse при вызове с реляционными базами данных 6 глава способов


Глава 5. Составляющие доступа к данным


89


SetKey, SetRangeXXX, FindKey, GotoKey, FindNearest либо GotoNearest. Вероятен только для компонента ттаЫе, т. к. для компонента Query отбор записей осуществляется средствами языка SQL.

□ dsCalcFields (расчет вычисляемых полей) — употребляется обработчик со­бытия OnCalcFields.

□ dsFilter (фильтрация записей) — в этот режим набор данных автоматиче­ски перебегает из с реляционными базами данных 6 глава режима dsBrowse всякий раз, когда производится обработ­чик действия OnFilterRecord. В режиме блокируются все пробы измене­ния записей. После окончания работы обработчика действия OnFilterRecord набор данных автоматом переводится в режим dsBrowse.

□ dsNewValue (воззвание к значению характеристики TField.NewValue).

□ dsOldValue (воззвание к значению характеристики TField.OldValue).

□ dsCurValue (воззвание с реляционными базами данных 6 глава к значению характеристики TField.CurValue).

□ dsBlockRead (запрет конфигурации частей управления и генерации событий при вызове способа Next).

□ dsinternalCalc (указание на необходимость вычислять значения полей, свойство TField. FieldKind которых имеет значение f klnternalCalc).

□ dsOpening (открытие набора данных).

Связи меж основными режимами наборов данных показаны на рис. 5.1, где приведены также некие способы с реляционными базами данных 6 глава и характеристики, при помощи которых набор данных перебегает из 1-го режима в другой.


90


Часть I. Базы работы с базами данных


Время от времени при описании операций, выполняемых с записями набора данных, под режимом редактирования предполагается не только лишь режим dsEdit конфигурации полей текущей записи, да и режим dsinsert вставки новейшей с реляционными базами данных 6 глава записи. Тем режим редактирования понимается в широком смысле слова как режим модифи­кации набора данных.

Набор данных употребляет режимы dsNewValue, dsOldValue, dsCurValue, dsBlockRead и dslnternalCalc для собственных нужд, обычно программер не анализирует их.

При выполнении программки можно найти режим набора данных с помо­щью одноименных параметров state типа TDataSetstate самого набора с реляционными базами данных 6 глава данных и связанного с ним источника данных DataSource. При изменении режима набо­ра данных для источника данных DataSource генерируется событие

OnStateChange типа TNotifyEvent.

Разглядим пример:

procedure TForial.DataSourcelStateChange(Sender: TObject);

begin

case DataSourcel.State of

dslnactive: Labell.Caption := 'Набор данных закрыт';

dsBrowse: Labell.Caption := 'Просмотр набора данных';

dsEdit: Labell.Caption := 'Редактирование набора с реляционными базами данных 6 глава данных';

dsinsert: Labell.Caption := 'Вставка записи в набор данных'

else Labell.Caption := 'Режим набора данных не определен';

end;

end;

В приведенной процедуре определяется режим набора данных, связанного с ис­точником данных DataSourcel, и информация об этом режиме выводится в надписи Labell. При всем этом употребляется свойство state с реляционными базами данных 6 глава источника данных. Код, выполняющий анализ режима, помещен в обработчик действия

OnStateChange компонента DataSourcel.

Доступ к полям

Каждое поле набора данных представляет собой отдельный столбец, для работы с которым в Delphi служат объект Field типа TField и объекты производных от него типов, к примеру, TlntegerField, TFloatField либо TStringField. Для доступа к с реляционными базами данных 6 глава этим объектам и, соответственно, к полям записей у набора данных есть особые способы и характеристики, доступные при выполнении приложения.

Свойство FieldCount типа integer показывает количество полей набора дан­ных. Это свойство доступно только для чтения. Количество полей набора дан­ных может отличаться от физического числа полей таблицы БД, так с реляционными базами данных 6 глава как в набор данных не непременно врубаются все поля таблицы. Состав полей фор­мируется при разработке приложения при помощи Редактора полей набора дан­ных и Редактора столбцов сетки DBGrid. Не считая того, может быть динамическое


Глава 5. Составляющие доступа к данным


91


изменение состава полей во время выполнения приложения. Для компонента Query состав полей набора данных с реляционными базами данных 6 глава также зависит от SQL-запроса.

Значение характеристики Fields [Index: Integer] типа TFieId представляет собой поле (столбец) набора данных. К отдельному полю можно обратиться, указав его номер index в массиве Fields; номера полей находятся в границах от нуля до FieldCount - 1. Номер объекта поля в массиве полей определяет свойство index с реляционными базами данных 6 глава типа integer. В отличие от Редакторов полей и столбцов, используемых на шаге разработки приложения, свойство index можно использовать для оп­ределения и конфигурации порядка полей набора данных во время выполнения приложения.

В качестве примера разглядим чтение полей текущей записи:

procedure TForml.ButtonlClick(Sender: TObject);

var n: integer;

begin

for n с реляционными базами данных 6 глава := 0 to Tablel.FieldCount - 1 do

ListBoxl.Items.Add(Tablel.Fields[n].AsString); end;

Тут содержимое каждого поля текущей записи интерпретируется как строко­вое значение и добавляется к списку ListBoxl.

Номер поля в наборе данных не является заблаговременно фиксированным и известным числом и находится в зависимости от порядка полей в таблице с реляционными базами данных 6 глава БД, от текущего состава полей набора данных, также от значений параметров неких зрительных компонен­тов, связанных с этим набором, к примеру, сетки DBGrid. Так, при изменении порядка расположения столбцов в компоненте DBGrid соответственно изменя­ется порядок следования полей набора данных. В связи с этим воззвание к ка­кому-либо с реляционными базами данных 6 глава полю по его номеру в массиве полей может вызвать воззвание со­всем к другому полю. Потому для доступа к полям почаще употребляются способы FindField И FieldByName.

Функция FindField (const FieldName: String): TField возвращает ДЛЯ набора данных поле, имя которого показывает параметр FieldName. В отличие от номера в массиве с реляционными базами данных 6 глава полей, имя поля более статично и меняется пореже. Не считая того, имя поля несет огромную смысловую нагрузку, чем номер. Если данное параметром FieldName поле не найдено, то способ FindField возвращает зна­чение Nil. На практике почаще употребляется способ FieldByName, который отли­чается от способа FindField тем, что если данное поле с реляционными базами данных 6 глава не найдено, то генери­руется исключение.

(_____ ЗамечаниеJ

Имя поля, определяемое параметром FieldName, является именованием физического поля таблицы БД, данным при разработке таблицы, а не именованием (свойством Name) объекта Field, которое предназначено для этого поля.


92


Часть I. Базы работы с базами данных


Для набора данных Query имя FieldName физического поля можно переопреде­лить с реляционными базами данных 6 глава в тексте SQL-запроса.

Свойство Fields и способы FindField и FieldByName более нередко исполь­зуются для доступа к значению поля текущей записи вместе с такими свой­ствами объекта Field, как AsString, Aslnteger, AsFloat либо AsBoolean, ко­торые позволяют обращаться к значению поля как к строковому, целочисленному, вещественному с реляционными базами данных 6 глава либо логическому значению соответственно.

Так,в коде

Var x: integer;

Labell.Caption := Tablel.FieldByName('Name').AsString; x := Tablel.FieldByName('Number').Aslnteger;

строковое значение поля Name отображается в надписи Labell, а переменной х присваивается целочисленное значение поля Number. Если же поле Number со­держит значение, которое нельзя интерпретировать как целое число, то генери с реляционными базами данных 6 глава­руется исключение.


s057-soil-s-s-hidekel-m-r-kaul-e-l-ginzburg.html
s10-ustrojstvo-sp-dorozhek-s-pokritiem-iz-plit-konstrukcii-i-materiali-poperechnij-profil-poryadok-proizvodstva-rabot.html
s1f05-filosofiya-rabochie-programmi-disciplin-v-strukture-osnovnoj-obrazovatelnoj-programmi-po-specialnosti.html