с реляционными базами данных 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;

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

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

uses unit2;

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


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

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


80


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


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

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

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

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

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

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

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

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

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

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

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

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



Глава 5


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

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

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

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

(_____ Замечание

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

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


82


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


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

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

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

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

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

Желательно задавать имя БД через псевдоним. Это заметно облегчает перенос приложения и файлов БД в другие каталоги и на другие компьютеры, т. к. для обес­печения работоспособности приложения после изменения расположения БД доста­точно изменить название каталога, на который ссылается псевдоним БД.

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

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

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

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

Tablel.Active:= False;

Tablel.DatabaseName: = 'BDPlace';

Table2.Active:= False;

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


Глава 5. Компоненты доступа к данным


83


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

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

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

var i: integer;

Tablel.First;

for i:= 1 to Tablel.RecordCount do begin

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

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

Table1.Next;

end;

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

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

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

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

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

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

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

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

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


84


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


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

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

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

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

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

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

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

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

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

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

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


Глава 5. Компоненты доступа к данным


85


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

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

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

TableName или SQL.

Приводимый пример демонстрирует управление состоянием набора данных с помощью свойства 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 и Close.

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

Процедура close закрывает набор данных, ее вызов эквивалентен установке свойства Active в значение False. При вызове метода close генерируются со­бытия 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;


86


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


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

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

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

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

(Замечание^

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

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

procedure TForial.TablelBeforeOpen(DataSet: TDataSet);

begin

if not CheckBoxl.Checked then Abort;

end;

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

procedure TFo rial.TablelBeforeOpen(DataSet: TDataSet);

begin

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

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

end;

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


Глава 5. Компоненты доступа к данным


87


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

procedure TForml.TablelAfterOpen(DataSet: TDataSet);

begin

if CheckBox2.Checked then

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

mtWarning, [mbOK], 0);

end;

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

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

и AfterClose. Они, как и события BeforeOpen и AfterOpen, имеют тип TDataSetNotifyEvent.

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

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

procedure TForml.TablelBeforeClose(DataSet: TDataSet);

begin

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

end;

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

СЗамечание^

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

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

procedure TForml.TablelAfterClose(DataSet: TDataSet);

begin

if CheckBox2.Checked then begin


88


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


Веер;

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

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

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

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

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

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

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

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

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

 

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

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

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

 

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

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

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


Глава 5. Компоненты доступа к данным


89


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

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

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

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

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

□ dsCurValue (обращение к значению свойства TField.CurValue).

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

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

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

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


90


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


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

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

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

OnStateChange типа TNotifyEvent.

Рассмотрим пример:

procedure TForial.DataSourcelStateChange(Sender: TObject);

begin

case DataSourcel.State of

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

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

dsEdit: Labell.Caption:= 'Редактирование набора данных';

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

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

end;

end;

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

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

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

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

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


Глава 5. Компоненты доступа к данным


91


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

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

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

procedure TForml.ButtonlClick(Sender: TObject);

var n: integer;

begin

for n:= 0 to Tablel.FieldCount - 1 do

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

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

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

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

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

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


92


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


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

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

Так,в коде

Var x: integer;

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

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: