WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 |   ...   | 4 | 5 || 7 | 8 |   ...   | 11 |

«Петр Дарахвелидзе Евгений Марков Санкт-Петербург «БХВ-Петербург» 2003 УДК 681.3.06 Б Б К 32.973.26-018.2 Д20 Дарахвелидае ...»

-- [ Страница 6 ] --

Самой критичной к возможной потере данных вследствие ошибки является Операция удаления записи, ПОЭТОМУ При ПОМОЩИ СВОЙСТВа ConfirmDelete можно включить механизм контроля удаления. При каждом удалении запи си нужно будет дать подтверждение выполняемой операции.

Нажатие любой кнопки можно эмулировать программно при помощи мето да BtnClick.

В случае необходимости выполнения дополнительных действий при щелчке на ЛЮбоЙ КНОПКе МОЖНО ВОСПОЛЬЗОВатЬСЯ Обработчиками СОбЫТИЙ BeforeAction и Onclick, в которых параметр Button определяет нажатую кнопку. Свойства и методы компонента TDBNavigator представлены в табл. 15.6.

Таблица 15.6. Свойства и методы компонента TDBNavigator Объявление ! Тип I Описание I | Свойства Pb Включает или отключает подтверждение property ConfirmDelete:

удаления записи Boolean;

Содержит список подсказок для каждой property Hints: TStrings;

РЬ кнопки Определяет внешний вид кнопок компо property Flat: Boolean;

РЬ нента Список видимых кнопок РЬ type TNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast, nblnsert, nbDeiete, nbEdit, nbPost, nbCancel, nbRefresh);

TButtonSet = set of TNavigateBtn;

property VisibleButtons:

TButtonSet;

364 Часть III. Приложения баз данных Таблица 15.6 (окончание) I Тип \ Описание Объявление Методы procedure BtnClick(Index: Pu | Эмулирует щелчок на кнопке index TNavigateBtn);

procedure SetBounds(ALeft, Pu Задает положение (параметры ALeft, ATop, AWidth, AHeight: I ATop) и размер компонента (параметры Integer);

! AWidth, AHeight) Методы-обработчики событий ENavClick = procedure Pb | Выполняется при щелчке на кнопке (Sender: TObject;

Button: I Button перед выполнением операции, TNavigateBtn) of object;

I связанной с кнопкой property BeforeAction:

ENavClick;

Pb i Выполняется при щелчке на кнопке ENavClick = procedure | Button после выполнения операции, (Sender: TObject;

Button:

I связанной с кнопкой TNavigateBtn) of object;

property OnClick:

ENavClick;

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

В зависимости от типа данных поля могут использовать различные компо ненты. Для большинства стандартных полей используются компоненты TDBText, TDBEdit, TDBComboBox, TDBListBox.

Данные в формате Memo отображаются компонентами товмето и TDBRichEdit.

Для показа изображений предназначен компонент TDBimage.

Компонент TDBText Этот компонент представляет собой статический текст, который отображает текущее значение некоторого поля связанного набора данных. При этом данные можно просматривать в режиме "только для чтения".

Непосредственным предком компонента является класс TCustomLabei, по этому он очень похож на компонент TLabei.

Глава 15. Компоненты отображения данных При использовании компонента следует обратить внимание на возможную длину отображаемых данных. Для предотвращения обрезания текста можно использовать свойства Autosize и wordwrap.

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

Прямой предок компонента — класс TCustomMaskEdit, который также явля ется прямым предком компонента TEdit.

Компонент может осуществлять проверку редактируемых данных по задан ной для поля маске. Непосредственно для редактора задать маску нельзя, т. к. содержащее маску свойство EditMask в классе TCustomMaskEdit является защищенным, а в TDBEdit не перекрыто. Тем не менее механизм контроля полностью унаследован. Саму же маску можно задать в связанном с редак тором поле. Объект TFieid имеет собственное свойство EditMask, которое и используется при проверке данных в редакторе (см. гл. 13).

Проверка редактируемого текста на соответствие маске осуществляется методом vaiidateEdit после каждого введенного или измененного символа.

В случае ошибки генерируется исключение vaiidateError и курсор устанав ливается на первый ошибочный символ.

В компоненте можно использовать буфер обмена. Это делается средствами операционной системы пользователем или программно при помощи мето дов CopyToClipboard, CutToClipboard, PasteFromClipboard.

КомпонентTDBCheckBox Компонент представляет собой почти полный аналог обычного флажка (компонент TCheckBox) и предназначен для отображения и редактирования любых данных, которые могут иметь только два значения. Это может быть логический тип данных или любые строковые значения, но поле может принимать значения только из двух строк.

Предопределенные значения задаются свойствами vaiuechecked и ValueUnchecked. По уМОЛЧаНИЮ ОНИ ИМеЮТ Значения True И False. ЭТИМ свойствам можно также присваивать любые строковые значения, причем одному свойству можно назначить несколько возможных значений, разде ленных точкой с запятой.

Включение флажка происходит, если значение поля набора данных совпа дает со значением свойства vaiuechecked (единственным или любым из спи ска). Если же флажок включил пользователь, то значение поля данных при 366 Часть III. Приложения баз данных равнивается к единственному или первому в списке значению свойства ValueChecked.

Аналогичные действия происходят и со свойством valueunchecked.

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

В поле можно передавать фиксированные значения, связанные с отдельны ми переключателями в группе.

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

Возможные значения, на которые должны реагировать переключатели в группе, заносятся в свойство Values при помощи специального редактора в Инспекторе объектов или программно посредством методов класса TStrings. Каждому элементу свойства values соответствует один переключа тель (порядок следования сохраняется).

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

Текущее значение связанного поля содержится в поле value.

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

Функционально компонент ничем не отличается от компонента TListBox.

Значение поля должно совпадать с одним из элементов списка.

Специальных методов компонент не содержит.

Компонент TDBComboBox Компонент отображает текущее значение связанного с ним поля набора данных в строке редактирования, при этом значение поля должно совпадать с одним из элементов разворачивающегося списка. Текущее значение мож но изменить на любое фиксированное из списка компонента. Функцио нально компонент ничем не отличается от компонента тсотЬоВох, представ ляющего собой комбинированный список.

Глава 15. Компоненты отображения данных Компонент может работать в пяти различных стилях, которые определяются свойством style.

Специальных методов компонент не содержит.

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

В компоненте можно использовать буфер обмена при помощи стандартных средств операционной системы или унаследованными от предка TCustoinMemo методами CopyToClipBoard, CutToClipBoard, PasteFromClipBoard.

Для ускорения навигации по набору данных при отображении полей типа BLOB можно использовать свойство AutoDispiay. При значении True любое новое значение поля автоматически отображается в компоненте. При зна чении False новое значение появляется только после двойного щелчка на компоненте или после нажатия клавиши при активном компоненте.

Метод LoadMemo используется автоматически при загрузке значения поля, если СВОЙСТВО AutoDispiay = False.

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

Компонент TDBImage Компонент предназначен для просмотра изображений, хранящихся в базах данных в графическом формате.

Редактировать изображения можно только в каком-либо графическом ре дакторе, перенося исходное и измененное изображение при помощи буфера обмена. Это делается средствами операционной системы пользователем ИЛИ программно при ПОМОЩИ МеТОДОВ CopyToClipboard, CutToClipboard, PasteFromClipboard.

Визуализация изображения осуществляется при помощи свойства Picture, которое представляет собой экземпляр класса TPicture.

Также можно полностью заменить существующее изображение или сохра нить новое в новой записи набора данных. Для этого используются методы свойства Picture.

368 Часть III. Приложения баз данных Свойство AutoDisplay позволяет управлять процессом загрузки новых изо бражений из набора данных в компонент. При значении True любое новое значение поля автоматически отображается в компоненте. При значении False новое значение появляется только после двойного щелчка на компо ненте или после нажатия клавиши при активном компоненте.

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

Компонент TDBRichEdit Компонент предоставляет возможности полноценного текстового редактора для просмотра и изменения текстовых данных, хранящихся в связанном по ле набора данных. Поле должно содержать информацию о форматировании текста.

Внешне компонент ничем не отличается от поля редактирования, поэтому о реализации доступа к гораздо более богатым возможностям редактора че рез интерфейс пользователя должен позаботиться разработчик. Для этого можно использовать дополнительные элементы управления.

Синхронный просмотр данных При разработке приложений для работы с базами данных часто возникает необходимость в связывании двух наборов данных по ключевому полю. На пример, в таблице Orders (содержит данные о заказах) демонстрационной базы данных DBDEMOS имеется поле CustNo, которое содержит идентифи кационный номер покупателя. Под этим же номером в таблице Customers хранится информация о покупателе (адрес, телефон, реквизиты и т. д.). При разработке пользовательского интерфейса приложения баз данных необхо димо, чтобы при просмотре перечня заказов в форме приложения отобра жались не идентификационные номера покупателей, а их параметры.

Таким образом, в наборе данных заказов вместо поля номера покупателя должно появиться поле имени покупателя из таблицы Customers. Механизм связывания полей из различных наборов данных по ключевому полю назы вается синхронным просмотром. В рассмотренном примере ключевым являет ся поле CustNo из таблицы Customers, а выбор конкретного наименования производится по совпадению значений ключевого поля и заменяемого поля Глава 15. Компоненты отображения данных из исходного набора данных — Orders. Причем необходимо, чтобы в табли це Customers поле custNo было уникальным (составляло первичный или вто ричный ключ).

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

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

В Delphi механизм синхронного просмотра реализован на уровне отдельных полей и компонентов.

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

Помимо простого синхронного просмотра данных может возникнуть задача редактирования данных в аналогичной ситуации. Для этого предназначены специальные компоненты синхронного просмотра данных, которые позво ляют, например, выбирать покупателя из списка, а изменится при этом но мер покупателя в наборе данных заказов. Использование таких компонен тов делает пользовательский интерфейс значительно более удобным и на глядным. В VLC Delphi есть два таких компонента: TDBLookupListBox И TDBLookupComboBox.

( ^ Примечание На странице Win 3.1 Палитры компонентов имеются еще два компонента:

TDBLokupList и TDBLookupCombo. Они обладают тем же набором функций, ис пользуются для обеспечения совместимости с приложениями, созданными в среде разработки Delphi 1, и поэтому здесь не рассматриваются.

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

Как и в любом другом компоненте отображения данных, в компонентах синхронного просмотра должны присутствовать средства связывания с тре буемым полем некоторого набора данных (табл. 15.7). Это уже известные свойства: DataSource — применяется для задания набора данных через ком понент TDataSource и DataFieid — для определения требуемого поля набора данных. Для синхронного просмотра следует выбирать такое поле, значения которого не дают пользователю полной информации об объекте и совпада ют с ключевым полем в таблице синхронного просмотра. Название этого Часть III. Приложения баз данных поля может не совпадать с названием ключевого поля, но типы данных должны быть одинаковыми.

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

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

Набор данных, содержащий указанные поля, определяется через соответст вующий компонент TDataSource В свойстве ListSource.

Ключевое поле задается свойством KeyFieid. Во время работы компонента в свойстве Keyvalue содержится текущее значение, которое связывает между собой два набора данных.

Поле синхронного просмотра определяется свойством ListFieid. Здесь можно задавать сразу несколько полей, которые будут отображаться в ком поненте синхронного просмотра. Названия полей разделяются точкой с за пятой. Если свойство не определено, то в компоненте будут отображаться значения ключевого поля. Свойство ListFieidindex служит для выбора ос новного поля из списка. Дело в том, что компоненты синхронного про смотра поддерживают механизм наращиваемого поиска, который позволяет быстро находить нужное значение в больших списках. Свойство ListFieidindex определяет, какое поле используется при наращиваемом по иске. В компоненте TDBiookupComboBox свойство ListFieidindex также опре деляет, какое поле будет передано в строку редактирования.

Таблица 15.7. Основные свойства, включающие механизм синхронного просмотра Объявление Тип | Описание property KeyField: string;

j Pb Ключевое поле таблицы синхронного просмотра property KeyValue: Pu | Текущее значение ключевого поля Variant;

property ListFieid: Поле или список полей синхронного про I Pb string;

смотра в таблице синхронного просмотра Номер основного поля синхронного property ListFieidindex: Pb Integer;

просмотра (используется, когда свойство L i s t F i e i d содержит список полей) Указывает на компонент TDataSource, свя property ListSource: Pb TDataSource;

занный с таблицей синхронного просмотра Глава 15. Компоненты отображения данных Таблица 15.7 (окончание) Объявление | Тип j Описание | Pb I Определяет комбинацию клавиш, нажатие p r o p e r t y NullValueKey:

TShortCut;

| которых задает нулевое значение поля l В качестве примера рассмотрим приложение DemoLookup (рис. 15.5), в ко тором с набором данных таблицы Orders из базы данных DBDEMOS связа ны Компоненты TDBGrid И TDBLookupComboBox. Во В О О компоненте при ТрМ перемещении по записям набора данных отображается имя покупателя, оформившего текущий заказ.

1 7 D m L ou e oo kp w;

Vj: ;

:г:;

:::-:>>::|.;

];

:;

ч';

:.-;

*;

::

•'» •'t^i%:iii!p:

'••.• Щ f i l i i i l g :.np^i:|SW:Div :

2l' !l ::;

:

|5Ь№а1в::;

!:*'':::Е1!:::;

5:;

:|:Е|г pN6-;

::'it|ShpToйКай";

!":!:!:!'!;

Ц 1351! 12.04.1988 03.05.198812:00:00 ) 114;

Ю03!

145lMatiaEventosh ;

!

1004J 2156 j17.04.1988 '18.04.1988 ;

21.01.198812:00:00 1005! 1356(20.04. 1380106.11.1994 07.11.198812:00:00 i 46!

1006!

: 02.05.1988 ! 1007! 1384f01.05. 1510:03.05.1988 104.05.1388 12:

1008:

12.05.1988 :

1009 1513!11.05. 12.05.1988 ;

1010! 1551i11.05. : 19.05.1388 !

1011 i 1560118.05. <• 20.05.1388 1563:19.05. 134!

26.05.1988 ;

1013 1624! 25.05. i 26.05.1988 ! 1014 1645(25.05. 71) 1651! 25.05.1988 !26.05.1988 i 1015;

< Рис. 15.5. Главная форма проекта DemoLookup Ключевые свойства компонента настроены следующим образом.

СВОЙСТВО ListSource указывает на Компонент CustSource ТИПа TDataSource, который связан с набором данных синхронного просмотра custTabie.

Свойство ListFieid указывает на поле Company, все значения которого дос тупны в списке компонента.

Свойство KeyField указывает на поле custNo, которое имеется в двух табли цах и по которому осуществляется связь.

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

Часть III. Приложения баз данных КомпонентTDBLookupListBox Компонент представляет собой список значений поля синхронного про смотра для поля, заданного свойством DataFieid, из набора данных DataSource. Его основное назначение — автоматически устанавливать соот ветствие между полями двух наборов данных по одинаковому значению за данного поля исходной таблицы и ключевого поля таблицы синхронного просмотра. В списке синхронного просмотра отображаются возможные зна чения для редактирования поля основной таблицы.

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

КомпонентTDBLookupComboBox Компонент представляет собой комбинированный список значений поля синхронного просмотра для поля, заданного свойством DataFieid, из набора данных DataSource. Его основное назначение — автоматически устанавли вать соответствие между полями двух наборов данных по одинаковому зна чению заданного поля исходной таблицы и ключевого поля таблицы син хронного просмотра. В списке синхронного просмотра отображаются воз можные значения для редактирования поля основной таблицы.

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

Графическое представление данных Для представления данных из некоторого набора данных в виде графиков различных видов предназначен компонент TDBChart (табл. 15.8). В нем мож но одновременно показывать графики для нескольких полей данных. Гра фики строятся на основе всех имеющихся в наборе данных значений полей.

Функционально компонент ничем не отличается от компонента TChart.

Настройка параметров компонента осуществляется специальным редакто ром, который можно открыть двойным щелчком на перенесенном на форму компоненте.

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

Основой любого графика в компоненте TDBChart является так называемая серия, свойства которой представлены классом Tchartseries. Для того что бы построить график значений некоторого поля набора данных, необходимо Глава 15. Компоненты отображения данных выполнить следующие действия, большинство из которых выполняется в специализированном редакторе компонента.

1. Создать новую серию и определить ее тип.

2. Задать для серии набор данных.

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

4. Открыть набор данных.

Редактор имеет две главные страницы — Chart и Series. Страница Chart со держит многостраничный блокнот и предназначена для настройки парамет ров самого графика. Страница Series также содержит многостраничный блокнот и используется для настройки серий значений данных.

Для создания новой серии необходимо в редакторе перейти на главную страницу Chart, а на ней открыть страницу Series (рис. 15.6). На этой стра нице нужно щелкнуть на кнопке Add, а затем в появившемся диалоге вы брать тип серии. После этого в списке на странице Series появляется строка новой серии. Здесь можно переопределить тип, цвет и видимость серии, щелкнув на соответствующей зоне строки.

Все остальные страницы блокнота на главной странице Chart предназна чены для настройки параметров графика.

Теперь необходимо перейти на главную страницу Series и на ней из списка названий серий выбрать необходимую. После этого на странице Data Source из списка выбирается строка DataSet. Далее в появившемся списке DataSet выбирается нужный набор данных.

[Editing DBChartl BQ| •Char(:'!|series).3-T-p::-\'3';

: ;

, 3. : 3. -3"' Series J General j Axis ;

| Titles | Legend) Panel j Paging j WallsJ 3D 3l ••'r~ri~;

.: :•;

'-;

;

•..:: • г^У:--?^ ;

'•'•• !: • ч •;

• : •:" •.• • ;

.'• ' '' •.••• v.'l :| : ! SeriesTitle' ;

:;

• :

^ :' i| j ^ j R | Setiesl '1 (^(f/ • Series2 ::

Celete j ^ ( P | Series lite;

. | /,', hange;

,.i: у-;

.-.

• •' ' •:.••... - "• •^йй-,1г.;

:

Рис. 15.6. Специализированный редактор компонента TDBChart 374 Часть III. Приложения баз данных Список X позволяет выбрать поле набора данных, значения которого будут последовательно откладываться по оси абсцисс. Список Y позволяет вы брать поле набора данных, значения которого будут отложены по оси орди нат. Соответствие между значениями полей по двум осям определяется принадлежностью к одной записи набора данных. Выбор поля в списке Labels привязывает его значения в виде меток к оси абсцисс.

( ) Примечание Здесь описан набор элементов управления для линейного типа серии. Для дру гих типов элементы управления могут отличаться.

Теперь осталось только открыть набор данных и компонент TDBChart по строит график.

Аналогичным образом на этот же компонент можно поместить и другие графики.

Таблица 15.8. Свойства и методы компонента TDBChart Объявление ! Описание Свойства property AutoRefresh : Boolean;

| Разрешает или запрещает обновление | данных в серии при открытии связан | ного набора данных Задает временной интервал в секундах property Refreshlnterval : Longlnt;

между обновлениями данных в сериях из связанных наборов данных Разрешает показ курсора "песочные property ShowGlassCursor : Boolean;

часы" при обновлении данных Методы procedure CheckDataSource;

| Обновляет данные в сериях function isValidDataSource (ASeries : { Проверяет, связан ли набор данных TChartSeries;

AComponent: | AComponent с серией ASeries. В случае TComponent) : Boolean;

v i r t u a l ;

! успеха проверки возвращает True procedure RefreshData;

| Обновляет данные во всех сериях procedure RefreshDataSet (ADataSet: | Считывает все записи в наборе данных TDataSet;

ASeries: TChartSeries);

i AdataSetИ переносит ИХ В серию I ASeries Методы-обработчики событий property OnProcessRecord : j Вызывается при переносе данных TProcessRecordEvent;

из отдельной записи набора данных | в серию Глава 15. Компоненты отображения данных Резюме Компоненты отображения данных играют важную роль при создании ин терфейсов приложений баз данных. Разнообразие предлагаемых элементов управления позволяет решать любые задачи по организации взаимодействия пользователя с базой данных. Все они взаимодействуют с набором данных Через КОМПОНенТ TDataSource.

Ш Технологии доступа к данным Процессор баз данных Borland Database Engine Глава 16.

Глава 17. Технология dbExpress Глава 18. Сервер баз данных InterBase и компоненты InterBase Express Глава 19. Использование ADO средствами Delphi ГЛАВА Процессор баз данных Borland Database Engine Любое приложение баз данных имеет в своем составе или использует сто ронний механизм доступа к данным, который берет на себя подавляющее большинство стандартных низкоуровневых операций работы с базами дан ных. Например, любое такое приложение при открытии таблицы БД долж но выполнить примерно одинаковый набор операций.

• поиск местоположения базы данных;

• поиск таблицы, ее открытие и чтение служебной информации;

• чтение данных в соответствии с форматом хранения данных и т. д.

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

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

Для работы с источниками данных при посредстве BDE в Delphi имеется специальный набор компонентов, расположенных на странице BDE Палит ры компонентов. Эти компоненты для работы с базами данных используют возможности BDE, обращаясь к его функциям и процедурам. Механизм доступа к BDE инкапсулирован в базовом классе TBDEDataSet. (Подробно базовые классы компонентов доступа к данным рассмотрены далее в этой части.) Поэтому в процессе программирования у вас не будет необход и Глава 16. Процессор баз данных Borland Database Engine мости использовать функции BDE напрямую. Почти все, что можно сделать путем прямого обращения, можно сделать и через компоненты — это проще и надежнее.

Тем не менее внутреннюю организацию механизма доступа к данным всегда полезно знать. Кроме этого, всегда полезно знать и уметь использовать дополнительные возможности, которые BDE может предоставить разработчику.

BDE взаимодействует с базами данных при посредстве драйверов. Для осо бенно распространенных локальных СУБД разработан набор стандартных драйверов. Работа с наиболее распространенными серверами БД осуществ ляется при помощи драйверов системы SQL Links. Кроме этого, если для базы данных существует драйвер ODBC, то можно использовать и его. Дос таточно зарегистрировать этот драйвер в BDE.

Однако BDE не претендует на всеобъемлющую универсальность и имеет некоторые недостатки. Это, например, снижение скорости работы прило жения, недостатки реализации некоторых драйверов и т. д. В документации к Delphi 7 содержится предупреждение, что после 2002 года фирма Borland перестанет поддерживать BDE и рекомендует использовать технологию dbExpress, которая также рассматривается в настоящей книге.

В этой главе обсуждаются следующие вопросы.

• архитектура и составные части BDE;

• что такое псевдонимы БД и настройка драйверов BDE;

• использование утилиты BDE Administrator;

• способы прямого использования функций API BDE;

П компоненты доступа к данным BDE.

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

В составе BDE поставляются стандартные драйверы, обеспечивающие дос туп к СУБД Paradox, dBASE, FoxPro и текстовым файлам. Локальные драй веры (рис. 16.1) устанавливаются автоматически совместно с ядром процес сора. Один из них можно выбрать в качестве стандартного драйвера, кото рый имеет дополнительные настройки, влияющие на функционирование процессора БД.

Часть IV. Технологии доступа к данным Приложение баз данных Локальная СУБД Сервер SQL Рис. 16.1. Структура процессора баз данных BDE Доступ к данным серверов SQL обеспечивает отдельная система драйве ров — SQL Links. С их помощью в Delphi можно без особых проблем разра батывать приложения для серверов Oracle 8, Informix, Sybase, DB2 и, естест венно, InterBase. Эти драйверы необходимо устанавливать дополнительно.

Помимо этого, в BDE имеется очень простой механизм подключения лю бых драйверов ODBC (к примеру, Microsoft Access) и создания на их основе сокетов ODBC.

Примечание С точки зрения пользователя процесс подключения локального драйвера и драйвера SQL Links практически не отличается, за исключением деталей на стройки. Настройка драйверов и собственных параметров BDE осуществляется при помощи специальной утилиты — BDE Administrator и рассматривается да лее в этой главе.

В состав BDE входят следующие функциональные подсистемы.

• Администратор системных ресурсов управляет процессом подключения к данным — при необходимости устанавливает нужные драйверы, а при завершении работы автоматически освобождает занятые ресурсы. Поэто му BDE всегда использует ровно столько ресурсов, сколько необходимо.

Глава 16. Процессор баз данных Borland Database Engine П Система обработки запросов обеспечивает выполнение запросов SQL или QBE от приложения к любым базам данных, для которых установлен драйвер, даже если сама СУБД не поддерживает прямое использование запросов SQL.

• Система сортировки является запатентованной технологией и обеспечи вает очень быстрый поиск по запросам SQL и через стандартные драйве ры для Paradox и dBASE.

• Система пакетной обработки представляет собой механизм преобразова ния данных из одного формата в другой при выполнении операций над целыми таблицами. Эта система использована в качестве основы для компонента TBatchMove и утилиты DataPump (автоматического переноса структур данных между базами данных), входящей в стандартную по ставку BDE.

• Менеджер буфера управляет единой для всех драйверов буферной об ластью памяти, которую одновременно могут использовать несколько драйверов. Это позволяет существенно экономить системные ресурсы.

• Менеджер памяти взаимодействует с ОС и обеспечивает эффективное использование выделяемой памяти. Ускоряет работу драйверов, которые для получения небольших фрагментов памяти обращаются к нему, а не к ОС. Дело в том, что менеджер памяти выделяет большие объемы опе ративной памяти и затем распределяет ее небольшими кусками между драйверами согласно их потребностям.

• Транслятор данных обеспечивает преобразование форматов данных для различных типов БД.

• Кэш BLOB используется для ускорения работы с данными в формате BLOB.

• SQL-генератор транслирует запросы в формате QBE в запросы SQL.

• Система реструктуризации обеспечивает преобразование наборов данных в таблицы Paradox или dBASE.

• Система поддержки драйверов SQL повышает эффективность механизма поиска при выполнении запросов SQL.

• Таблицы в памяти. Этот механизм позволяет создавать таблицы непо средственно в оперативной памяти. Используется для ускорения обра ботки больших массивов данных, сортировки, преобразования форматов данных.

П Связанные курсоры обеспечивают низкоуровневое выполнение межтаб личных соединений. Позволяют разработчику не задумываться над реа лизацией подобных связей при работе на уровне VCL — для этого доста точно установить значения нескольких свойств.

Часть IV. Технологии доступа к данным П Менеджер конфигурации обеспечивает разработчику доступ к информации о конфигурации драйверов.

Перечисленные функции реализованы в динамических библиотеках, кото рые, собственно, и называются процессором БД (табл. 16.1).

Таблица 16.1. Ядро процессора баз данных BDE Имя файла Назначение IDAPI32.DLL Базовая динамическая библиотека BDE IDPROV.DLL Динамическая библиотека, отвечающая за работу серверной части приложения BLW32.DLL Динамическая библиотека, обеспечивающая поддержку драйверов национальных языков IDBAT32.DLL Динамическая библиотека с функциями межтабличного переноса данных Динамическая библиотека, обеспечивающая работу запросов IDQBE32.DLL по примеру (Query By Example, QBE) IDSQL32.DLL Динамическая библиотека, обеспечивающая обработку запросов SQL IDASCI32.DLL Динамическая библиотека, обеспечивающая работу драйвера текстовых файлов IDPDX32.DLL Динамическая библиотека, обеспечивающая работу драйвера Paradox IDDBAS32.DLL Динамическая библиотека, обеспечивающая работу драйвера dBASE DODBC32.DLL Динамическая библиотека, обеспечивающая работу драйвера сокета ODBC IDR20009.DLL Динамическая библиотека ресурсов, содержащая сообщения об ошибках IDDAO32.DLL Динамическая библиотека, обеспечивающая работу драйверов Microsoft Access 95 и Jet Engine 3. IDDA3532.DLL Динамическая библиотека, обеспечивающая работу драйверов Microsoft Access 97 и Jet Engine 3. IDDR32.DLL Динамическая библиотека для работы с Репозиторием данных Кроме этого имеется шесть дополнительных DLL, обеспечивающих работу BDE с серверами Oracle и Microsoft SQL Server.

Глава 16. Процессор баз данных Borland Database Engine Псевдонимы баз данных и настройка BDE Для успешного доступа к данным приложение и BDE должны обладать ин формацией о местоположении файлов требуемой базы данных. Задание маршрута входит в обязанности разработчика.

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

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

В первом приближении можно сказать, что вы просто присваиваете мар шруту произвольное имя, которое используется в приложении. Тогда при переносе приложения на компьютере заказчика достаточно создать стан дартными средствами BDE одноименный псевдоним и настроить его на нужный каталог. При этом само приложение не требует переделок, т. к. оно обращается к псевдониму с одним именем, а вот BDE уже "знает" куда от править запрос приложения, использовавшего этот псевдоним.

Помимо маршрута к файлам базы данных, псевдоним BDE обязательно со держит информацию о драйвере БД, который используется для доступа к данным. Наличие других параметров зависит от типа драйвера, а значит, от типа СУБД.

Для управления псевдонимами баз данных, настройки стандартных и до полнительных драйверов в составе BDE имеется специальная утилита — BDE Administrator (исполняемый файл BDEADMIN.EXE).

Стандартная конфигурация BDE сохраняется в файле IDAPI.CFG. При необходимости текущую конфигурацию можно сохранить в новом файле с расширением cfg или загрузить заново при помощи команд Save As Configuration и Open Configuration из меню Object.

В верхней части окна утилиты расположена Панель инструментов, кнопки которой используются при работе с конкретным элементом настройки BDE.

Рабочая область утилиты BDE Administrator представляет собой двухстра ничный блокнот.

Страница Databases (рис. 16.2) содержит иерархическое дерево, в узлах ко торого расположены установленные в системе на данный момент псевдо нимы БД. При выборе какого-либо псевдонима в правой части панели по является путь к файлам базы данных и перечень параметров драйвера, соот ветствующего псевдониму, которые можно настраивать вручную.

Часть IV. Технологии доступа к данным 1 * D L Administrator C\ r ga Fe \ o m n Files.Borland 5 ae \ D \ A IC G HEsIEll D :Po r m i sL m o l h r dB EI P F D.

O e t dit::View•i'jCpttons.. Hel bc j «f5iawseAlia^s-^j^':;

..;

;

'--^^;

:': fbefinitionofDBDEpS;

г Database* | Configuration | ;

XL :. л '-.Definition'|' f / f i •;

;

STANDARD н Qs Databases Type PARADOX DEFAULT DRIVER Й- ^ dBASE Files ENABLE BCD FALSE Щ- "g dBase Files-Word PATH CAProgram Files^Common FilesSBorland Shared\Data B EB- "g Excel Files B- "a FoxPro Files-Word S' Jg IB Local B- "g IBProd ! § IBProdOkr ш 13- ~g Locals erver e~ ~в MQIS a - ^g MS Access Database a * 3 Visual FoxPro Databasi S "g1 Visual FoxPro Tables \>\ Г Рис. 16.2. Окно утилиты BDE Administrator с открытой страницей Databases (* B E Administrator C:\Program Files\Conimon FilesXBurland 5hared\BDE\IDAPI.CFG D 'Object Definition of INIT DefWtion;

!

В Q$ Configuration AUTO ODBC FALSE DEFAULT DRIVER PARADOX n- Qj Drivers LANGDRIVER 'ascii'ANSI ! a-Qj Native LOCAL SHARE FALSE 1 a - Q j ODBC LOW MEMORY USAGE System MAXBUFSIZE MAXFILEHANDLES MEMSIZE MINBUFSIZE MTS POOLING FALSE SHAREDMEMLOCATIC SHAREDMEMSIZE SQLQRYMODE SYS FLAGS VERSION |bitems' in ШГ.

Рис. 16.3. Окно утилиты BDE Administrator с открытой страницей Configuration Страница Configuration (рис. 16.3) используется для настройки параметров драйверов BDE, предназначенных для обеспечения доступа к локальным СУБД и серверам БД. Также здесь определяется системная конфигурация Глава 16. Процессор баз данных Borland Database Engine BDE, которая включает параметры числовых форматов, форматов даты и времени. Вся информация на этой странице также структурирована в виде иерархического дерева.

При выборе в левой части панели утилиты какого-либо узла, в правой части на странице Definition отображается вся необходимая информация для этого объекта.

Сохранение изменений осуществляется при помощи команд меню Object, всплывающего меню или при перемещении на другой псевдоним.

Для создания нового псевдонима требуется выбрать команду New из меню Object или из всплывающего меню узла Databases на одноименной страни це. Затем в появившемся простом диалоге задается необходимый драйвер.

Отметим, что один из четырех стандартных локальных драйверов устанав ливается на странице Configuration в качестве предопределенного, поэтому в списке он доступен под названием STANDARD, а остальные не видны вообще. Из драйверов SQL Links доступны те, которые были установлены при инсталляции Delphi или позже.

Кроме того, в списке можно выбрать один из драйверов ODBC, установка которых осуществляется стандартными системными средствами на Панели управления Windows.

После выбора драйвера в дереве псевдонимов БД появляется новый узел, для драйвера которого требуется установить необходимые параметры (см.

ниже).

Для четырех локальных драйверов список параметров в правой части пане ли утилиты на странице Definition ограничивается параметрами стандартно го драйвера (STANDARD), подробная настройка для каждого драйвера осуществляется на странице Configuration.

Назначение параметров локальных драйверов BDE (Paradox, dBASE, FoxPro, ASCII) представлено в табл. 16.2.

Таблица 16.2. Параметры драйверов BDE для локальных баз данных Параметр Назначение STANDARD DEFAULT DRIVER I Задает тип конкретного локального драйвера (Paradox, | dBASE, FoxPro, ASCII) ENABLE BCD | Определяет способ представления вещественных чи | сел. При значении True такие числа преобразуются | в формат BCD (Binary Coded Decimals — десятичные j с двоичным кодированием). Точность составляет I знаков после запятой PATH | Указывает путь к файлам базы данных 13 Чак. 386 Часть IV. Технологии доступа к данным Таблица 16.2 (продолжение) Назначение Параметр PARADOX NET DIR Указывает путь к файлу обеспечения сетевого доступа к БД PDOXUSRS.NET. Драйвер приложения, которое работает с БД локально, должен указывать на этот файл, расположенный на том же компьютере. Драйвер приложения, обращающегося к БД по сети, должен ука зывать на подключенный сетевой диск с этим файлом Нередактируемая информация о версии драйвера VERSION Тип СУБД. Для Paradox имеет значение FILE. Только TYPE для чтения LANGDRIVER Определяет драйвер языковой поддержки (используйте драйвер Paradox Cyrr 866) Задает размер блоков дискового пространства для хра BLOCK SIZE нения записей, кратно FILL FACTOR Определяет процент заполнения блока дискового про | странства при хранении индексов, по умолчанию 95% I Задает формат временной таблицы в памяти:

LEVEL I • 3 — совместим с Paradox 3.5 и ниже;

I • 4 — Paradox 4.0;

5 — Paradox 5.0;

7 - Paradox для WIN STRICTINTEGRTY Определяет возможность использования приложениями на базе Paradox 4.0 более поздних таблиц со ссылочной целостностью. При значении True использование раз решается, но возникает риск нарушения целостности данных DBASE VERSION Нередактируемая информация о версии драйвера TYPE Тип СУБД. Для dBASE имеет значение FILE. Только для чтения LANGDRIVER Определяет драйвер языковой поддержки (используйте драйвер dBASE RUS ср866) LEVEL | Задает формат таблиц. Значение соответствует номеру i версии СУБД MDX BLOCK SIZE Размер блоков для файлов с расширением mdx, крат но MEMO FILE BLOCK SIZE Размер блоков для файлов с данными типа Memo (рас ширение dbt), кратно Глава 16. Процессор баз данных Borland Database Engine Таблица 16.2 (окончание) Параметр Назначение FOXPRO VERSION Нередактируемая информация о версии драйвера TYPE Тип СУБД. Для FoxPro имеет значение FILE. Только для чтения LANGDRIVER Определяет драйвер языковой поддержки Имеет значение LEVEL ( Примечание J Драйвер текстовых файлов ASCIIDRV имеет параметры стандартного драй вера.

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

Драйверы для серверов InterBase и Sybase не представлены, т. к. содержат только общие для двух серверов параметры.

Таблица 16.3. Параметры драйверов ВОЕдля серверов SQL Назначение Параметр Общие параметры (встречаются как минимум у двух драйверов) Нередактируемая информация о версии драйвера VERSION Тип СУБД. Только для чтения TYPE Название библиотеки динамического связывания SQL DLL Links для 16-разрядного драйвера. Только для чтения Название библиотеки динамического связывания SQL DLL Links для 32-разрядного драйвера. Только для чтения Используется только при необходимости применения DRIVER FLAGS старых версий драйвера, где не поддерживается уро вень изоляции транзакций Read Committed. Для этого необходимо установить значение Содержит битовую маску, которая определяет тип выда TRACE MODE ваемой отладочной информации Задает число записей, модифицируемых в одном паке BATCH COUNT те при фиксации транзакций Размер кэша для данных типа BLOB. Диапазон от 32К BLOB SIZE доЮООК Часть IV. Технологии доступа к данным Таблица 16.3 (продолжение) 1 Назначение Параметр Задает число кэшируемых записей с данными BLOB.

BLOBS TO CACHE Диапазон от 64 до 65 ENABLE BCD Определяет способ представления вещественных чи сел. При значении True такие числа преобразуются в формат BCD (Binary Coded Decimals— десятичные с двоичным кодированием), который позволяет округлять погрешности высших разрядов дробной части числа.

Изменение параметра для псевдонима работает, только если параметр драйвера на странице Configuration не пустой ENABLE SCHEMA CACHE Определяет режим кэширования структуры данных. При значении True структура таблиц БД кэшируется ло кально в каталоге, задаваемом параметром SCHEMA CACHE DIR. Рекомендуется использовать только для баз данных с постоянной структурой LANGDRIVER Определяет драйвер языковой поддержки MAX ROWS | Ограничивает максимальное число записей, которое | может быть передано клиенту в ответ на запрос. Значе | ние по умолчанию -1 (ограничений нет) OPEN MODE Режим работы с записями БД:

• READ/WRITE — полный доступ;

• READ ONLY — только чтение Каталог для локального кэширования структуры данных SCHEMA CACHE DIR (см. параметр ENABLE SCHEMA CACHE) Задает число таблиц, структура данных которых может SCHEMA CACHE SIZE кэшироваться Задает время хранения кэшируемой структуры данных:

SCHEMA CACHE TIME • -1 — время не ограничено;

• 0 — данные не кэшируются;

• 1 - 2147483647 - секунды Указывает путь к таблицам БД (это может быть локаль SERVER N A M E ный маршрут или маршрут с указанием удаленного сервера БД) SQLPASSTHRU MODE | Задает способ использования соединения с сервером прямыми запросами SQL и запросами, управляемыми пользователем.

[ SHARED AUTOCOMMIT— соединение используется совместно и прямые запросы фиксируются автомати чески.

Глава 16. Процессор баз данных Borland Database Engine Таблица16.3(продолжение) Параметр Назначение (прод.) SHARED NO AUTOCOMMIT— соединение используется совместно и прямые запросы фиксируются сервером самостоятельно.

NOT SHARED — совместное использование запрещено SQLQRYMODE Задает режим управления запросами.

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

SERVER — запрос передается серверу.

LOCAL — запрос выполняется локально VENDOR INIT Название файла динамической библиотеки поставщика CONNECT TIMEOUT Определяет временной интервал, после которого клиент попытается восстановить прерванную связь с сервером TIMEOUT Задает время ожидания ответа сервера на запрос BLOB EDIT LOGGING Управляет механизмом сохранения всех изменений для полей типа BLOB. При значении True изменения сохра няются DATABASE NAME Имя базы данных MAX QUERY TIME I Задает максимальное время ожидания ответа на запрос USER NAME | Имя пользователя, которое используется сервером при | подключении Microsoft SQL Server (MSSQL) Максимальное число процессов, одновременно рабо MAX DBPROCESSES I тающих в данном соединении | Имя приложения, помогающее серверу идентифициро APPLICATION NAME вать процессы Определяет формат даты:

DATE MODE. О - МДГ;

• 1 - ДМГ;

. 2 - ГМД Содержит имя рабочей станции. Помогает серверу при HOST NAME идентификации процессов Задает национальный язык, который используется для NATIONAL LANG NAME вывода текста в сообщениях об ошибках Определяет размер пакетов потоков данных TDS PACKET SIZE 390 Часть IV. Технологии доступа к данным Таблица 16.3 (окончание) Параметр | Назначение Oracle (ORACLE) NET PROTOCOL | Устанавливает сетевой протокол передачи данных Informix (INFORMIX) DATE SEPARATOR Задает разделитель для формата даты Microsoft Access (MSACCESS) SYSTEM DATABASE Путь к системной базе данных с информацией о правах доступа. При изменении параметра драйвер необходи мо перезагрузить DB2 (DB2) DB2 DSN | Задает имя соединения с БД. Это название псевдонима клиента DB2, который создается на сервере DRIVER Имя драйвера DB ROWSET SIZE Определяет число записей, передаваемых одновременно Драйверы ODBC ODBC DRIVER Имя драйвера ODBC ODBC DSN i Имя набора данных ODBC После настройки параметров драйвера и сохранения текущей конфигурации новый псевдоним становится доступен для любого приложения, исполь зующего BDE.

Страница Configuration, помимо настройки установленных в BDE драйве ров, позволяет редактировать параметры, используемые BDE при инициа лизации приложения. Эти параметры доступны при выборе узлов System, a затем INIT иерархического дерева. Назначение параметров представлено в табл. 16.4.

Таблица 16.4. Параметры инициализации приложения Параметр Назначение AUTO ODBC В значении True при каждой инициализации в BDE автоматически импортируются все установленные в системе драйверы ODBC DATA REPOSITORY Имя текущего словаря данных DEFAULT DRIVER Локальный драйвер, используемый по умолчанию в драйвере STANDARD Глава 16. Процессор баз данных Borland Database Engine Таблица 16.4 (окончание) Параметр Назначение LANGDRIVER Драйвер языковой поддержки. При использовании стандартных локальных драйверов это значение пе рекрывают те, которые определены непосредственно в конфигурациях драйверов Paradox, dBASE, FoxPro, ASCII LOCAL SHARE Устанавливает режим совместного использования файлов приложениями, работающих через BDE и другие программы. В значении True совместное ис пользование разрешено LOW MEMORY USAGE LIMIT Максимальный объем памяти (в Кбайтах), который BDE пытается использовать в первом Мбайте опера тивной памяти Максимальный размер кэша данных. Он должен быть MAXBUFSIZE не меньше значения параметра MINBUFSIZE и кра тен Максимальное число используемых файлов MAXFILEHANDLES Максимальный объем используемой BDE памяти MEMSIZE в Мбайтах Минимальный размер кэша данных. Он должен быть MINBUFSIZE не больше значения параметра MAXBUFSIZE и кра тен Управляет режимом объединения ресурсов MTS MTS POOLING (Microsoft Transaction Server). Обеспечивает лучшую производительность Содержит адрес памяти, который пытаются исполь SHAREDMEMLOCATION зовать Менеджер памяти и Менеджер буфера. При возникновении конфликтов адрес необходимо поме нять вручную. Задается только второе слово адреса Максимальный объем памяти, используемый Менед SHAREDMEMSIZE жером памяти и Менеджером буфера См. табл. 16. SQLQRYMODE Не используется SYSFLAGS Номер внутренней версии BDE. Только для чтения VERSION Также на странице Configuration устанавливаются параметры форматов да ты, времени и чисел. Доступ к параметрам осуществляется через узлы System и Format.

392 Часть IV. Технологии доступа к данным Интерфейс прикладного программирования BDE Как уже говорилось выше, любое приложение Delphi, работающее с базами данных и написанное с использованием стандартных компонентов доступа к данным, обращается к данным и получает результат при помощи BDE.

При этом механизм доступа к данным использует вызовы функций из API BDE.

Достаточно сложно представить себе такую ситуацию, когда возникает не обходимость создания приложения, использующего только функции BDE, без применения компонентов доступа к данным VCL. А вот отдельные функции вполне могут понадобиться в любой программе. Поэтому рассмот рим процесс работы приложения, использующего вызовы BDE, т. к. это дает хорошую возможность понять механизм доступа к данным, который реализован в Delphi.

Итак, для создания приложения на основе вызовов функций BDE необхо димо выполнить следующие операции:

1. Инициализация BDE (функция Dbiinit).

2. Открытие объекта базы данных (функция DbiopenDatabase).

3. Определение рабочего каталога (функция DMSetDirectory), если на пре дыдущем этапе не задается псевдоним БД.

4. Определение временного каталога (функция DMSetPrivateDir).

5. Открытие набора данных и создание курсора (функции DbiOpenTabie, DbiQExec И Пр.;

ДесКрИПТОр Курсора hDBICur).

6. Заполнение структуры cuRProps, содержащей данные о курсоре и наборе ДаННЫХ (фуНКЦИЯ DbiGetCursorProps).

7. Выделение памяти для буфера записи.

8. Навигация ПО набору ДаННЫХ (функции DbiSetToBegin, DbiSetToEnd, DbiSetToCursor И пр.) 9. Чтение необходимой записи (фуНКЦИИ DbiGetRelativeRecord, DbiGetNextRecord, DbiGetRecord, DbiGetPriorRecord И Др.).

10. Чтение или обновление необходимого поля (функции DbiGetFieid, DbiPutField).

11. Освобождение всех ресурсов (освобождение буфера записи, закрытие курсора, таблицы, BDE).

При использовании в программе функций из API BDE необходимо вклю чить в секцию uses модуль BDE.

В прикладном программировании задачи, которые требовали бы выполне ния всех описанных выше операций, практически не встречаются. Между Глава 16. Процессор баз данных Borland Database Engine тем, включение в программный код отдельных функций API BDE оправда но. В качестве примера рассмотрим приложение, которое позволяет очи стить таблицу базы данных (рис. 16.4).

Дело в том, что при удалении записи из таблицы локальной СУБД (напри мер Paradox) размер файла таблицы остается прежним, даже если удалить все записи. То есть на самом деле запись не удаляется, а только становится недоступной. При интенсивном использовании базы данных файлы таблиц могут занимать значительные объемы дискового пространства при довольно умеренном числе записей.

7 B E m tT b D E py a e l Список псевдонимов баз данных:

И Список таблиц текущей базы данных:

5$t Очистить текущую таблица Рис. 16.4. Главная форма проекта BDEEmptyTable Полная очистка таблиц базы данных осуществляется функцией DbiEmptyTabie из API BDE. Именно она используется в демонстрационном приложении для радикального уменьшения размера таблиц.

( Примечание ) Функция DbiEmptyTabie используется в методе EmptyTable компонентов дос тупа к данным (см. гл. 17).

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

:"'."•'•"'•"-"".""- *" •••—••••-•д- » ••> '• • - •,.........,.,, «j } Листинг 16.1. Модуль главной формы приложения BDEEmptyTable : | unit Main;

interface Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, BDE, ExtCtrls, DBCtrls, Grids, DBGrids, Db, DBTables, Buttons;

394 Часть IV. Технологии доступа к данным type TMainForm = class(TForm) AliasesList: TComboBox;

TablesList: TComboBox;

EmptyBtn: TBitBtn;

Labell: TLabel;

Label2: TLabel;

procedure FormClose(Sender: TObject;

var Action: TCloseAction);

procedure FormShow(Sender: TObject);

procedure AliasesListChange(Sender: TObject);

procedure EmptyBtnClick(Sender: TObject);

private hDB: hDBIDB;

hCursor: hDBICur;

DBDesc: DBDesc;

TblDesc : TBLBaseDesc;

public { Public declarations } end;

var MainForm: TMainForm;

implementation {$R *.DFM} procedure TMainForm.FormShow(Sender: TObject);

var Rslt: DBIResult;

begin AliasesList.Items.Clear;

TablesList.Items.Clear;

hDB := Nil;

try Dbilnit(Nil);

// Инициализация BDE DbiOpenDatabaseList(hCursor);

repeat Rslt:= DbiGetNextRecord(hCursor, dbiNOLOCK, @DBDesc, nil);

if (Rslt <> DBIERR_EOF) then AliasesList.Items.Add(StrPas(DBDesc.szName));

until (rslt О DBIERR_NONE);

DbiCloseCursor(hCursor);

except on E:EDBEngineError do ShowMessage('Ошибка инициализации BDE');

end;

end;

Глава 16. Процессор баз данных Borland Database Engine procedure TMainForm.FormClose(Sender: TObject;

var Action: TCloseAction);

begin try finally if hDB <> Nil then DbiCloseDatabase(hDB);

// Закрытие базы данных DbiExit;

// Закрытие сеанса работы с BDE end end;

procedure TMainForm.AliasesListChange(Sender: TObject);

begin try if hDB <> Nil then DbiCloseDatabase(hDB);

// Закрытие базы данных DbiOpenDatabase // Открытие базы данных ( PChar(AliasesList.Text), // Псевдоним базы данных Nil, // Тип базы данных dbiReadWrite, // Режим редактирования данных dbiOpenShared, // Режим разделения данных Nil, // Пароль О, // Число дополнительных параметров Nil, // Перечень полей для доп. параметров Nil, // Список доп. параметров hDB // Дескриптор базы данных );

DbiSetPrivateDir('с:\temp');

// Определение временного каталога DbiOpenTableList(hDb, False, False, '*.DB', hCursor);

TablesList.Items.Clear;

TablesList.Clear;

while DbiGetNextRecord(hCursor, dbiNOLOCK, @TblDesc, nil) = dbiErr_None do TablesList.Items.Add(TblDesc.szName);

DbiCloseCursor(hCursor);

except on E:EDBEngineError do ShowMessage('Ошибка открытия базы данных );

end;

end;

procedure TMainForm.EmptyBtnClick(Sender: TObject);

begin try DbiEmptyTable(hDB, Nil, PChar(TablesList.Text), ' ' ) ;

except 396 Часть IV. Технологии доступа к данным on E:EDBEngineError do ShowMessage('Неверно задана таблица');

end;

end;

end.

При открытии главной формы (метод-обработчик FormShow) функция Dbiinit осуществляет инициализацию BDE. Затем функция DbiOpenDatabaseList создает в памяти временную таблицу, в которую записываются характери стики каждой зарегистрированной базы данных. Для этого применяется структура DBDesc. Курсор hcursor обеспечивает доступ к записям о базах данных.

После этого функция DbiGetNextRecord позволяет осуществить последова тельное считывание имен псевдонимов баз данных (для этого в параметре передается указатель на структуру DBDesc) и их запись в список компонента AliasesList типа TComboBox.

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

Функция DbiOpenTabieList создает временную таблицу в памяти, в которую помещаются данные о таблицах выбранной базы данных в соответствии с форматом структуры TBLBaseDesc. Функция DbiGetNextRecord позволяет пе редать эту информацию в список компонента TabiesList типа TComboBox.

При щелчке на кнопке EmptyBtn в методе-обработчике EmptyBtnciick работа ет функция DbiEmptyTable, которая очищает выбранную ранее в компоненте TabiesList таблицу.

Теперь рассмотрим пример простейшего приложения, которое может ото бражать два поля из таблицы COUNTRY.DB в демонстрационной базе дан ных DBDEMOS. Эта база данных поставляется в комплекте Delphi. В при мере использованы только функции API BDE.

Проект называется DirectBDE и имеет только одну форму, в которой ото бражаются сведения из таблицы COUNTRY.DB о государствах и их столи цах (рис. 16.5). Кнопки в нижней части формы позволяют перемещаться по набору данных.

i Листинг 16.2. Модуль главной формы приложения DirectBDE !

unit Unitl;

interface Глава 16. Процессор баз данных Borland Database Engine uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, BDE, ExtCtrls;

type TMainForm = class(TForm) PriorBtn: TBitBtn;

Panel2: TPanel;

NextBtn: TBitBtn;

Label3: TLabel;

CountryEdit: TEdit;

Labell: TLabel;

CapitalEdit: TEdit;

procedure PriorBtnClick(Sender: TObject);

procedure FormShowtSender: TObject);

procedure FormClose(Sender: TObject;

var Action: TCloseAction);

procedure NextBtnClick(Sender: TObject);

private hDB: hDBIDB;

hCur: hDBICur;

CursProps: CurProps;

RecBuf: pByte;

FValue: array[0..255] of Char;

IsEmpty: Bool;

procedure OnBDEError;

public end;

var MainForm: TMainForm;

implementation {$R *.DFM} procedure TMainForm.OnBDEError;

var Errlnfo: dbiErrlnfo;

// Структура, содержащая информацию об ошибках AStr: String;

begin DbiGetErrorlnfo(True, Errlnfo);

// Функция возвращает информацию об ошибке case Errlnfo.iError of 9733: AStr := 'Для создания записи недостаточно параметров';

10024: AStr := 'Ошибка доступа к данным';

10245: AStr := 'База данных занята другим пользователем';

10038: AStr := 'Значение поля задано неверно';

398 Часть IV. Технологии доступа к данным 11871: AStr := 'Несоответствие типов';

11959: AStr := 'В выражении отсутствует оператор GROUP BY';

else AStr := 'Ошибочная операция с данными';

end;

ShowMessage(AStr);

end;

procedure TMainForm.FormShow(Sender: TObject);

begin hDB := Nil;

hCur := Nil;

Dbilnit(Nil);

// Инициализация системы BDE DbiOpenDatabase // Открытие базы данных ( 'DBDEMOS', // Псевдоним базы данных Nil, // Тип базы данных dbiReadWrite, // Режим редактирования данных dbiOpenShared, // Режим разделения данных Nil, // Пароль О, // Число дополнительных параметров Nil, // Перечень полей для доп. параметров Nil, // Список доп. параметров hDB // Дескриптор базы данных );

DbiSetPrivateDir('с:\temp');

// Определение временного каталога DbiOpenTable // Открытие таблицы ( hDB, // Дескриптор базы данных PChar('COUNTRY'), // Название таблицы PChar(szParadox), // Тип таблицы (только для локальных БД) Nil, // Название индекса (необязательный) Nil, // IndexTagName — только для dBASE О, / / 0 — использовать первичный индекс dbiReadWrite, // Режим редактирования данных dbiOpenShared, // Режим разделения данных xltField, // Режим трансляции данных False, // Признак одностороннего перемещения курсора Nil, // Дополнительные параметры hCur // Дескриптор курсора таблицы );

DbiGetCursorProps // Определение параметров курсора ( hCur, // Дескриптор курсора таблицы Глава 16. Процессор баз данных Borland Database Engine CursProps // Структура параметров курсора );

GetMem // Выделение памяти под буфер записи ( RecBuf, CursProps.iRecbufSize*SizeOf(Byte) );

DbiSetToBegin(hCur);

// Установка курсора в начало набора данных DbiGetNextRecord // Перемещение на первую запись ( hCur, // Дескриптор курсора таблицы dbiNoLock, // Режим ограничения доступа RecBuf, // Буфер записи Nil // Параметры записи );

DbiGetField // Получение значения поля ( hCur, // Дескриптор курсора таблицы 1, // Номер поля в структуре таблицы RecBuf, // Буфер записи @FValue, // Переменная, в которую передается значение IsEmpty // Признак пустой ячейки );

MainForm.CountryEdit.Text := FValue;

DbiGetField(hCur, 2, RecBuf, SFValue, IsEmpty);

MainForm.CapitalEdit.Text := FValue;

end;

procedure TMainForm.FormClose(Sender: TObject;

var Action: TCloseAction);

begin try finally FreeMem(RecBuf);

// Освобождение памяти буфера записи DbiCloseCursor(hCur);

// Закрытие курсора DbiCloseDatabase(hDB);

// Закрытие базы данных DbiExit;

// Закрытие сеанса работы с BDE end end;

procedure TMainForm.PriorBtnClicMSender: TObject);

begin try if DbiGetPriorRecord(hCur, dbiNoLock, RecBuf, Nil) = DBIERR_BOF then PriorBtn.Enabled := False Часть IV. Технологии доступа к данн else begin if Not NextBtn.Enabled then NextBtn.Enabled := True;

DbiGetField(hCur, 1, RecBuf, SFValue, IsEmpty);

MainForm.CountryEdit.Text := FValue;

DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);

MainForm.CapitalEdit.Text := FValue;

end;

except OnBDEError;

end;

end;

procedure TMainForm.NextBtnClick(Sender: TObject);

begin try if DbiGetNextRecord(hCur, dbiNoLock, RecBuf, Nil)=DBIERR_EOF then NextBtn.Enabled := False else begin if Not PriorBtn.Enabled then PriorBtn.Enabled := True;

DbiGetField(hCur, 1, RecBuf, @FValue, IsEmpty);

MainForm.CountryEdit.Text := FValue;

DbiGetField(hCur, 2, RecBuf, SFValue, IsEmpty);

MainForm.CapitalEdit.Text := FValue;

end;

except OnBDEError;

end;

end;

end.

I 7§ Пример п р я м о г о использования API BDE Столица:

Рис. 16.5. Главная форма проекта DirectBDE Глава 16. Процессор баз данных Borland Database Engine При показе главной формы приложения в процедуре Formshow проводится инициализация BDE, открытие базы данных и таблицы. При этом создают ся дескрипторы базы данных hDB И курсора таблицы hcur, которые играют в дальнейшей работе приложения важную роль. Если при создании базы дан ных не указывать псевдоним БД, то обязательно нужно определить рабочий каталог базы данных с помощью функции DMSetDirectory.

После этого отводится память под буфер записи, в который будут переда ваться значения полей текущей строки таблицы. Размер буфера определяет ся При П М Щ Структуры CURProps.

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

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

При закрытии формы проводятся операции по освобождению памяти буфе ра записи, закрытию базы данных и BDE.

Соединение с источником данных Все обращения из приложения к таблицам одной базы данных осуществля ются через одно соединение, на которое замыкаются все компоненты дос тупа к данным, имеющие соответствующие значения свойства DatabaseName (см. ниже).

Все управление одиночным соединением с какой-либо базой данных в BDE осуществляется компонентом TDatabase (табл. 16.5). В процессе работы компонент активно использует параметры псевдонимов и драйверов BDE.

Таблица 16.5. Свойства и методы компонента TDatabase Тип Описание Объявление Свойства property AliasName: string;

Pb i Задает имя псевдонима BDE исполь i зуемой базы данных Управляет включением соединения property Connected: Boolean;

Pb с базой данных property DatabaseName: s t r i n g ;

| Pb j Определяет имя базы данных Часть IV. Технологии доступа к данным Таблица 16.5 (продолжение) Объявление | Тип | Описание Возвращает число открытых наборов property DataSetCount: Ro данных, работающих через данное Integer;

соединение property DataSets[Index: Ro Индексированный список всех объек тов открытых наборов данных этого Integer]: TDBDataSet;

соединения property Directory: string;

| Pu j Определяет текущий каталог для баз данных Paradox и dBASE | Содержит имя драйвера базы данных property DriverName: string;

РЬ РЬ I При значении True другие приложения property Exclusive: Boolean;

I не могут работать с базой данных ! одновременно с этим компонентом Pu | Дескриптор BDE. Используется для type HDBIDB: Longint;

прямых вызовов функций API BDE property Handle: HDBIDB;

Pu | При значении True дескриптор BDE property HandleShared:

| компонента доступен в компоненте Boolean;

I TSession Показывает состояние транзакции.

property InTransaction: Ro При значении True транзакция выпол Boolean няется Ro | При значении True соединение property IsSQLBased: Boolean;

I работает через драйвер SQL Links РЬ | При значении True соединение про property KeepConnection:

| должает оставаться активным после Boolean;

| закрытия всех наборов данных. При | значении False после закрытия по | следнего набора данных соединение | закрывается type TLocale: Pointer;

Ro Указывает на языковый драйвер BDE, используемый при работе с базой дан property Locale: TLocale;

ных property LoginPrompt: Boolean;

Управляет отображением стандартного РЬ диалога регистрации пользователя при подключении к серверу property Params: TStrings;

РЬ | Содержит список значений параметров | псевдонима BDE, которые пользова | тель задает перед подключением к серверу Глава 16. Процессор баз данных Borland Database Engine Таблица 16.5 (продолжение) Объявление Тип Описание property Session: TSession Ro | Указывает на компонент TSession, | который управляет работой данного I компонента property SessionAlias: При значении True при подключении Ro Boolean;

к БД используется псевдоним сессии property SessionName: string;

Содержит имя сеанса, который управ РЬ ляет работой компонента property Readonly: Boolean;

Pb Управляет режимом доступа к данным "только для чтения" Pu property Temporary: Boolean;

Значение True говорит о том, что экземпляр компонента создан во время выполнения Pu type Определяет перечень операций, выполнение которых отображается TTraceFlag = (tfQPrepare, в утилите SQL Monitor при выполнении tfQExecute, tfError, приложения tfStint, tfConnect, tfTransact, tfBlob, tfMisc, tfVendor, tfDataln, tfDataOut);

TTraceFlags = set of TTraceFlag;

property TraceFlags:

TTraceFlags;

Pb Определяет уровень изоляции type TTransIsolation = (tiDirtyRead, транзакций:

tiReadCommitted, • tiDirtyRead—незавершенное tiRepeatableRead);

чтение;

property Translsolation:

• tiReadCommitted—завершенное TTransIsolation;

чтение;

• tiRepeatableRead — повторяемое чтение Методы procedure ApplyUpdates(const Фиксирует все изменения в наборах Pu DataSets: array of данных, работающих через это TDBDataSet);

соединение, в базе данных Pu | Закрывает все открытые наборы procedure Close;

| данных и соединение Pu i Закрывает все открытые наборы procedure CloseDatasets;

j данных, работающие через это соеди I нение Часть IV. Технологии доступа к данным Таблица 16.5 (окончание) | Тип | Описание Объявление Завершает выполнение текущей тран procedure Commit;

Pu закции и фиксирует все изменения в базе данных Pu | Выполняет запрос SQL без использо function Execute(const SQL:

I вания компонента TQuery. Текст string;

Params: TParams = | запроса содержится в параметре SQL.

nil;

Cache: Boolean = False;

Cursor: phDBICur = nil): I Параметры запроса определяются па Integer;

| раметром Params. Режим кэширования ! изменений включается параметром | Cache. Параметр Cursor может ис | пользоваться при работе с функциями | BDE, использующими курсор набора I данных (см. гл. 14) Изменяет представление о структуре procedure Pu FlushSchemaCache(const таблиц БД, загруженной в память TableName: string);

Pu Открывает соединение procedure Open;

Pu Отменяет все операции текущей тран procedure Rollback;

закции и завершает ее i procedure StartTransaction;

Pu [ Начинает выполнение транзакции procedure ValidateName(const Pu | Вызывает исключительную ситуацию, Name: string);

| если база данных Name уже открыта I в текущей сессии Методы-обработчики событий type TLoginEvent = Вызывается при регистрации Pb procedure(Database: пользователя на сервере TDatabase;

LoginParams:

TStrings) of object;

property OnLogin: TLoginEvent;

РЬ I Вызывается после подключения property AfterConnect:

TNotifyEvent;

property AfterDisconnect: РЬ | Вызывается после отключения TNotifyEvent;

property BeforeConnect: РЬ | Вызывается перед подключением TNotifyEvent;

i property AfterDisconnect: РЬ | Вызывается перед отключением TNotifyEvent;

Глава 16. Процессор баз данных Borland Database Engine Обычно компонент TDatabase размещается в модуле данных приложения.

Для определения базы данных (сервера), с которой приложение устанавли вает соединение при помощи компонента TDatabase, чаще используется СВОЙСТВО AliasName. Свойства DatabaseName И DriverName пред оставляют ЯЛЬ тернативный способ создания соединения.

ЕСЛИ Соединение задано СВОЙСТВОМ AliasName, TO СВОЙСТВО DatabaseName можно использовать для создания временного псевдонима, который будет доступен только для компонентов доступа к данным внутри приложе ния. При щелчке на кнопке списка доступных псевдонимов свойства DatabaseName в Инспекторе объектов для любого компонента доступа к дан ным в списке будет доступен и временный псевдоним компонента TDatabase.

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

Дополнительные возможности управления наборами данных при переклю чении соединения предоставляют свойства Connected И KeepConnection. Они позволяют одновременно с соединением закрыть все активные наборы данных.

Если наборы данных приложения подключены к базе данных через компо нент TDatabase, то перед их открытием необходимо установить соединение с БД. Соединение с БД устанавливается при помощи метода Open. Если по пытаться активизировать набор данных без этого метода, то соединение бу дет установлено автоматически.

Аналогичная картина возникает при закрытии наборов данных и отключе нии от БД. Дополнительное средство управления в этом случае предостав ляет свойство KeepConnection. Если оно равно значению True, то при закры тии последнего открытого набора данных соединение остается открытым.

В противном случае соединение автоматически закрывается.

Это позволяет управлять соединением в различных исходных ситуациях.

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

При подключении к базе данных довольно часто требуется задать значения для параметров драйвера BDE. Для этого используется свойство Params, представляющее собой обычный список. В нем необходимо задавать назва ния изменяемых параметров и их новые значения:

USERNAME=SYSDBA PAS SWORD=ma s t e r ke у Значения параметров можно задавать как статически, так и динамически во время выполнения.

406 Часть IV. Технологии доступа к данным Компонент TDatabase может облегчить подключение к базам данных с реги страцией пользователей. При регистрации на сервере достаточно задать имя пользователя, пароль в свойстве Params (см. выше) и установить для свойства LoginPrompt значение False. Эта комбинация работает как во время выпол нения, так и во время разработки.

Примечание Для организации доступа к защищенным паролем таблицам Paradox использу ется метод AddPassword компонента TSession (см. выше).

Дополнительные возможности обработки регистрации пользователя дает единственный метод-обработчик OnLogin, программный код которого вы полняется вместо появления стандартного диалога ввода имени и пароля.

Это позволяет разработчику создавать собственные сценарии регистрации пользователей.

Для обеспечения доступа к функциям API BDE используется свойство Handle (BDE играет важную роль при создании соединения).

Управление выполнением транзакций осуществляется при помощи методов StartTransaction, Commit И RollBack.

Компоненты доступа к данным Компоненты доступа к данным, используемые при разработке приложений BDE, раполагаются на странице BDE Палитры компонентов. Их общими предками являются классы TBDEDataSet и TDBDataSet (см. рис. 12.1). Они обеспечивают работоспособность основных компонентов доступа к данным BDE — TTable, TQuery, TStoredProc.

Класс TBDEDataSet Этот класс является потомком класса TDataSet, его значение трудно пере оценить: именно TBDEDataSet обеспечивает работоспособность важнейших механизмов набора данных за счет обращения к функциям BDE (табл. 16.6).

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

Напомним, что все эти механизмы не созданы "с нуля", а только дополнены обращениями к функциям BDE в необходимых местах методов, изначально описанных в классе TDataSet. Например, для обеспечения фильтрации запи сей набора данных к классу добавлено новое свойство:

Глава 16. Процессор баз данных Borland Database Engine type TFilterOption = (foCaselnsensitive, foNoPartialCompare);

TFilterOptions = set of TFilterOption;

property FilterOptions: TFilterOptions;

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

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

( Примечание ) Эта возможность очень полезна при создании клиентских приложений в архи тектуре клиент/сервер и играет ключевую роль при обеспечении возможности редактирования наборов данных сложных запросов SQL.

Дополнительно к методам работы с полями класса TDataSet добавлены функции использования полей в формате BLOB.

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

type HDBICur: Longint;

property Handle: HDBICur;

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

Таблица 16.6. Свойства и методы класса TBDEDataSet Объявление Тип | Описание Свойства p r o p e r t y BlockReadSize: j Pu I Определяет размер буфера при integer;

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

Если значение свойства больше нуля, навигация по набору данных осуществ ляется без изменения состояния компонентов отображения данных и I | вызова методов-обработчиков событий property CacheBlobs: Boolean;

Pu Разрешает использование буфера | памяти для данных типа BLOB Часть IV. Технологии доступа к дан Таблица 16.6 (продолжение) Объявление Тип I Описание Pb | Включает или отключает режим кэши property CachedUpdates:

! рования изменений в наборе данных.

Boolean;

! Используется в клиентских приложе | ниях архитектуры клиент/сервер Pu, | Если набор данных позволяет делать property CanModify: Boolean;

Ro изменения, свойство возвращает True, иначе — False г Показывает, используются ли в наборе property Explndex: Boolean;

Pu, данных индексы dBASE Ro property Filter: string;

Содержит выражение для фильтра Pb, набора данных Ro property Filtered: Boolean;

Управляет включением фильтра Pb, набора данных Ro TFilterOption = | Определяет параметры фильтра:

Pb (foCaselnsensitive, • f o C a s e l n s e n s i t i v e —строковые foNoPartialCompare);

значения фильтруются без учета регистра;

property FilterOptions:

TFilterOptions;

• foNoPartialCompare — при фильт рации символ "*" рассматривается как обычный символ, иначе он означает, что на этом месте может находиться произвольное под множество любых символов type HDBICur: Longint;

Указатель на курсор BDE, связанный Pu, с текущей записью набора данных Ro property Handle: HDBICur;

property KeySize: Word;

Содержит размер ключа для текущего Pu, индекса набора данных Ro type TLocale: Pointer;

Указатель на языковый драйвер BDE I Pu, | Ro property Locale: TLocale;

property RecNo: Longint;

Номер текущей записи набора данных I Pu property RecordCount: Longint;

Содержит число записей в наборе I Ro данных г Ro Содержит размер одной записи набора property RecordSize: Word;

данных property UpdateObject: Экземпляр объекта TUpdateObject, I Pu TDataSetUpdateObject;

используемого при кэшировании изменений Глава 16. Процессор баз данных Borland Database Engine Таблица 16.6 (продолжение) Объявление Тип Описание type TUpdateRecordTypes = set j Pu Определяет видимость записей of (rtModified, rtlnserted, I в режиме кэширования изменений rtDeleted, rtUnmodified);

I в зависимости от их состояния:

property UpdateRecordTypes: I • rtModified — доступны изменен TUpdateRecordTypes;

| ные записи;

• rtinserted —доступны добавлен ные записи;

• rtDeleted — доступны удаленные записи;

• rtUnmodified —доступны немодифицированные записи Значение True говорит о том, что property UpdatesPending: Ro буфер изменений при кэшировании Boolean;

содержит не сохраненные на сервере изменения Методы Pu i Записывает изменения из буфера procedure ApplyUpdates;

I в базу данных в режиме кэширования Pu | Проверяет существование экземпляра function | закладки, передаваемого в параметре BookmarkValid(Bookmark:

I Bookmark TBookmark): Boolean;

override;

Pu ! Отменяет все изменения, сделанные procedure Cancel;

I в текущей записи с момента последне I го сохранения Pu | Отменяет все изменения, сделанные procedure CancelUpdates;

с момента последней записи в базу данных и очищает буфер в режиме I кэширования Pu | Очищает буфер изменений в режиме procedure CommitUpdates;

I кэширования Pu | Проверяет идентичность закладок, function I указанных в параметрах Bookmarkl CompareBookmarks(Bookmarkl, | и Bookmark2. При значении 1 сигнали Bookmark2: TBookmark):

| зирует о наличии отличий в двух за Integer;

| кладках Pu | Обеспечивает доступ к функциям function I ограничения данных API BDE ConstraintCallBack(Req:

DsInfoReq;

var ADataSources:

DataSources): DBIResult;

stdcall;

410 Часть IV. Технологии доступа к данным Таблица 16.6 (продолжение) | Тип | Описание Объявление function ConstraintsDisabled: Pu Показывает, включены или отключены Boolean;

ограничения данных Создает поток для чтения/записи дан function Pu ных типа BLOB CreateBlobStream(Field:

TField;

Mode:

TblobStreamMode): TStream;

override;

procedure DisableConstraints;

Отключает ограничения данных Pu procedure EnableConstraints;

Pu Включает ограничения данных Pu Переносит все изменения из буфера procedure FetchAll;

I и восстанавливает все записи от теку | щей позиции до конца набора данных | Передает в базу данных все изменения procedure FlushBuffers;

Pu | из буфера записи | Читает все данные BLOB из поля function Pu GetBlobFieldData(FieldNo: FieldNo в буфер B u f f e r Integer;

var Buffer:

TblobByteData): Integer;

override;

function Помещает текущую строку в буфер Pu GetCurrentRecord(Buffer: Buffer PChar): Boolean;

Обновляет информацию о текущем procedure Getlndexlnfo;

Pu индексе набора данных function IsSequenced: Boolean;

Определяет, поддерживает ли таблица Pu override;

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

function Locate(const I Pu Параметр KeyFields содержит список KeyFields: string;

const полей, по которым ведется поиск.

KeyValues: Variant;

Options:

TlocateOptions): Boolean;

Параметр KeyValues содержит значе ния полей для поиска. Параметр Options определяет условия поиска.

Если запись найдена, курсор набора данных устанавливается на эту запись и возвращается True (см. гл. 14) Глава 16. Процессор баз данных Borland Database Engine Таблица 16.6 (окончание) Объявление Тип Описание function Lookup(const Осуществляет поиск в наборе данных.

Pu KeyFields: string;

const Возвращает массив значений требуе KeyValues: Variant;

const мых полей найденной записи. Пара ResultFields: string): метры аналогичны методу Locate Variant;

(см. гл. 14) Пересылает сделанные в текущей procedure Post;

override;

Pu записи изменения в базу данных Отменяет все изменения в текущей procedure RevertRecord;

Pu строке при работающем буфере изме нении Форматирует текст. Если параметр procedure Translate(Src, Dest: Pu ToOem = True, текст Src в формате PChar;

ToOem: Boolean);

override;

ANSI переводится в текст Dest в формате OEM и наоборот Возвращает тип сохраняемых в буфере function UpdateStatus:

изменений данных (см. табл. 16.1) TUpdateStatus;

Методы-обработчики событий Вызывается при возникновении ошибки TUpdateAction = (uaFail, Pu переноса кэшированных в буфере uaAbort, uaSkip, uaRetry, изменений в таблицу базы данных uaApplied);

TUpdateErrorEvent = procedure(DataSet: TDataSet;

E: EDatabaseError;

UpdateKind: TUpdateKind;

var UpdateAction:

TUpdateAction) of object;

property OnUpdateError:

TUpdateErrorEvent;

type TUpdateAction = (uaFail, Вызывается при сохранении кэширо Pu uaAbort, uaSkip, uaRetry, ванных в буфере изменений для от uaApplied);

дельной записи.

TUpdateRecordEvent = Применяется для организации допол procedure(DataSet: TDataSet;

нительного управления этим процес UpdateKind: TUpdateKind;

сом, например для контроля какого var UpdateAction: либо конкретного значения TUpdateAction) of object;

property OnUpdateRecord:

TUpdateRecordEvent;

412 Часть IV. Технологии доступа к данным Класс TDBDataSet Класс TDBDataSet является непосредственным предком основных компонен тов доступа к данным ттаЫе, TQuery и TstoredProc. Новые свойства и мето ды класса обеспечивают соединение набора данных с базой данных и ис пользуют функции BDE (табл. 16.7).

В процессе соединения важнейшую роль играет свойство DatabaseName, ко торое должно содержать псевдоним или полный путь к файлам БД. Для управления отдельным соединением с базой данных можно применять спе циальный компонент TDatabase. Указатель на экземпляр такого компонента содержится В свойстве Database.

Многие функции API BDE используют в своей работе дескриптор спе циальной структуры, описывающей подключенную базу данных. Доступ к этому дескриптору можно получить через свойство DBHandie.

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

Совокупность соединений управляется в рамках сеанса работы, который инкапсулируется компонентом TSession. Указатель на экземпляр такого компонента можно использовать в наборе данных при помощи свойства DBSession.

Для работы с удаленными серверами в класс введено свойство Provider, обеспечивающее доступ к интерфейсу iprovider.

Таблица 16.7. Свойства и методы класса TDBDataSet Объявление Тип Описание Свойства При значении True все автоматически property AutoRefresh: Pb создаваемые значения полей (авто Boolean;

инкрементные, значения по умолчанию) обновляются автоматически Указатель связанного с набором данных property Database: TDatabase;

Pu, компонента TDatabase Ro Псевдоним базы данных property DatabaseName: Pu, string;

Pb Дескриптор базы данных. Используется type HDBISES: Longint;

Pu, при работе с API BDE Ro property DBHandie: HDBISES;

Идентифицирует языковый драйвер type TLocale: Pointer;

Pu, API BDE Ro property DBLocale: TLocale;

Указатель для компонента TSession, property DBSession: TSession Pu, с которым работает набор данных Ro Глава 16. Процессор баз данных Borland Database Engine Таблица 16.7 (окончание) Объявление | Тип Описание property Provider: IProvider;

Pu, ;

Идентифицирует интерфейс I P r o v i d e r Ro | property SessionName: string;

Pu, I Содержит имя компонента сеанса, Ro | в котором работает набор данных Методы function CheckOpen(Status: Возвращает результат вызова BDE.

Pu DBIResult): Boolean;

Используется для тестирования соеди нения Закрывает связь с базой данных, procedure Pu определяемой параметром Database CloseDatabase(Database:

TDatabase);

Возвращает в списке L i s t параметры procedure Pu языкового драйвера GetProviderAttributes(List:

TList);

override;

Открывает связь с базой данных, опре function OpenDatabase: Pu деляемой свойством DatabaseName TDatabase;

Компонент ТТаЫе Компонент ттаЫе инкапсулирует таблицу реляционной базы данных, при чем независимо от типа базы данных. Для доступа к данным компонент ис пользует функции BDE (см. выше).

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

Таблица БД, на основе которой создается набор данных, определяется свой ством TabieName. При необходимости тип таблицы задается свойством таЫеТуре, хотя обычно это свойство имеет значение ttDefauit (см.

табл. 16.4), которое включает автоматическое определение типа таблицы по расширению файла.

Примечание Свойство ТаЫеТуре работает только в локальных БД. Обратите внимание, что возможные значения свойства соответствуют основным типам локальных драй веров BDE.

При помощи методов Open и close набор данных открывается и закрывает ся. О его состоянии можно судить по значению свойства Active. Более под робно о состоянии набора данных расскажет свойство state (см. ниже).

414 Часть IV. Технологии доступа к данным Записи в набор данных можно отбирать при помощи свойств Filter, Filtered, FilterOptions, создающих фильтр, ограничивающий набор данных по значениям данных в одном или нескольких полях.

Методы SetRangeStart, SetRangeEnd, SetRange, ApplyRange, EditRangeStart, EditRangeEnd создают специальный диапазон включаемых в набор данных записей, отбор в диапазон проводится по задаваемым граничным значениям любых полей набора данных.

ПОИСК НУЖНОЙ записи МОЖНО осуществлять методами Lookup ИЛИ Locate (достаточно просто, но не очень быстро) или, используя существующие в таблице базы данных индексы, методом FindKey (сложнее, но очень быстро).

От предков компонент унаследовал инструменты для работы с закладками.

Это СВОЙСТВО Bookmark И методы GetBookmark, FreeBookmark, GotoBookmark.

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

Использование индексов обеспечено свойствами IndexName, IndexFields, IndexFieldNames,IndexFiles.

Свойства MasterSource, MasterField, IndexName ДаЮТ ВОЗМОЖНОСТЬ установить отношение типа главный/подчиненный с другой таблицей.

Очень полезны в практическом использовании методы и свойства для работы С буфером Изменений (свойства CachedUpdates, PendingUpdates, UpdateRecordTypes, методы ApplyUpdates, CancelUpdates, CoimnitUpdate, RevertRecord). Буфер применяется в клиентских приложениях многоуровне вых систем доступа к данным.

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

В табл. 16.8 приведена справочная информация о свойствах и методах ком понента ттаЫе. После этого рассматриваются подробности применения ос новных механизмов набора данных.

Таблица 16.8. Свойства и методы класса ттаЫе j ! ~~ ~ Объявление I Тип I Описание _ I i Свойства Ссылается на компонент TDataSource property DataSource: I Pu, главного набора данных в отношении TDataSource;

| Ro главный/подчиненный Глава 16. Процессор баз данных Borland Database Engine Таблица 16.8 (продолжение) Объявление I Тип I Описание I Pb I Управляет сортировкой данных. При зна property Defaultlndex:

j ! чении True записи упорядочиваются Boolean;

| | по первичному ключу. При значении False I I упорядочивание не производится i Pb | Ограничивает доступ к таблице. При зна property Exclusive:

чении True с таблицей может работать Boolean;

только одно приложение. Это свойство | важно при одновременной работе | нескольких приложений с данными | в локальной сети Pu, | Значение True говорит о том, что связан property Exists: Boolean;

Ro | ная с компонентом таблица базы данных | существует Содержит информацию об индексах property IndexDefs: Pb таблицы TindexDefs;

Возвращает число полей в текущем ин property IndexFieldCount: | Pu, дексе таблицы Integer;

I Ro Разделенный запятыми список названий I Pb property IndexFieldNames:

полей, составляющих текущий индекс.

string;

Используется для таблиц серверов SQL Индексированный список полей текущего property IndexFields: Pu индекса [Index: Integer]: TField;

I Список индексных файлов для таблиц property IndexFiles: Pb | dBASE TStrings;

Определяет вторичный индекс для табли property IndexName: string;

I Pb цы. Используется для таблиц локальных СУБД Управляет границами диапазона, зада property KeyExclusive: I Pu ваемого методом SetRange. При значении Boolean;

!

True крайние записи в диапазон не вклю чаются Содержит число полей ключа, используе property KeyFieldCount: | Pu мых при поиске. При значении 0 применя Integer;

I ется только первое поле, при значе нии 1 — два первых поля и т. д.

По умолчанию устанавливается полное число полей ключа Список имен полей главной таблицы, раз property MasterFields: j Pb деленных запятой, используемых при соз string;

| дании отношения главный/подчиненный Часть IV. Технологии доступа к данным Таблица 16.8 (продолжение) Объявление Тип Описание Содержит имя компонента TDataSource, property MasterSource: | Pb TDataSource;

I связанного с набором данных, который является главным в отношении глав ный/подчиненный property Readonly: Boolean;

I Pb Включает и отключает режим "только для чтения". В некоторых случаях набор дан ных можно открыть только в этом режиме Pb | При значении True все сведения об ин property StoreDefs:

I дексах и структуре таблицы хранятся вме Boolean;

! сте с формой или модулем данных.

| В этом случае при создании набора | данных одновременно создаются поля, | индексы,ограничения property TableLevel: Pu i Содержит значение уровня таблицы, Integer;

| используемого в драйвере BDE property TableName: РЬ Определяет имя таблицы TFileName;

Pb Определяет тип таблицы для стандартного type ТТаЫеТуре = драйвера BDE. Значение t t D e f a u l t озна (ttDefault, ttParadox, ttDBase, ttASCII, чает, что тип таблицы определяется по ttFoxPro);

расширению файла property TableType:

ТТаЫеТуре;

Методы Создает новый индекс. Параметр Name procedure Addlndex(const Pu определяет имя нового индекса, параметр Name, Fields: string;

Fields — список полей индекса через Options: TIndexOptions), запятую, параметр Options задает тип индекса Включает в работу границы диапазона, procedure ApplyRange;

Pu заданные методами SetRangeStart, SetRangeEnd ИЛИ EditRangeStart, EditRangeEnd Переносит записи из таблицы ASource type TBatchMode = Pu в набор данных. Тип операции задается (batAppend, batUpdate, параметром AMode. Возвращает число batAppendUpdate, batDelete, batCopy);

обработанных записей function BatchMove(ASource:

TBDEDataSet;

AMode:

TBatchMode): Longint;

Глава 16. Процессор баз данных Borland Database Engine Таблица 16.8 (продолжение) \ Тип I Описание Объявление Удаляет текущий диапазон procedure CancelRange;

| Pu Закрывает индексный файл для таблиц procedure [ Pu dBASE CloselndexFile(const IndexFileName: string);

Создает новую таблицу, основываясь I Pu procedure CreateTable;

на данных о структуре таблицы, содержа | щихся в свойствах FieldDef s И | IndexDefs. Если свойство FieldDefs | пустое, используется свойство F i e l d s.

I Структура и данные существующей | таблицы перезаписываются Pu | Удаляет вторичный индекс procedure Deletelndex(const Name: string);

Уничтожает таблицу базы данных. Набор procedure DeleteTable;

Pu данных при этом должен быть закрыт Переводит набор данных в режим редак procedure EditKey;

Pu тирования буфера поиска. После исполь зования этого метода можно изменять значения полей, которые применяются для поиска записей Разрешает редактирование нижней Pu procedure EditRangeEnd;

границы диапазона Разрешает редактирование верхней Pu procedure EditRangeStart;

границы диапазона Удаляет все записи из набора данных Pu procedure EmptyTable;

Проводит поиск записи, значения полей Pu function FindKey(const которой удовлетворяют условиям, задан KeyValues: array of ным параметром KeyValues. Значения const): Boolean;

разделяются запятыми. Для поиска можно использовать только поля, входящие в текущий индекс. Для локальных стандарт ных таблиц BDE это поля, определяемые свойством indexName. Для таблиц серве ров SQL индекс можно задать свойством IndexFieldNames. При успешном поиске функция возвращает значение True Проводит поиск записи, значения полей procedure FindNearest(const j Pu которой, заданные параметром KeyValues, KeyValues: array of в минимальной степени отличаются const);

от требуемых в большую сторону. Значе ния для поиска разделяются запятыми.

14Зак Часть IV. Технологии доступа к данным Таблица 16.8 (продолжение) Объявление Тип Описание (прод.) Для поиска можно использовать только поля, входящие в текущий индекс. Для локальных стандартных таблиц BDE это поля, определяемые свойством indexName. Для таблиц серверов SQL индекс можно задать свойством IndexFieldNames. При успешном поиске функция возвращает True procedure Pu | Возвращает список индексов таблицы GetlndexNames(List:

TStrings);

procedure Синхронизирует курсор набора данных Pu GotoCurrent(Table: с курсором таблицы, заданной парамет TTable);

ром Table function GotoKey: Boolean;

Устанавливает курсор на запись, соответ Pu ствующую значениям полей, заданным при последнем применении метода SetKey или EditKey Устанавливает курсор на запись, точно procedure GotoNearest;

Pu соответствующую значениям полей, заданным при последнем применении метода SetKey или EditKey, или следую щую ближайшую к ним по значениям type TLockType = Закрывает доступ к таблице Paradox или Pu dBASE из других приложений (ltReadLock, ltWriteLock);

procedure LockTable(LockType:

TLockType);

procedure Открывает индексный файл таблицы Pu OpenlndexFile(const dBASE IndexFileName: string);

procedure RenameTable(const Переименовывает таблицу Paradox или Pu NewTableNarae: string);

dBASE Очищает буфер поиска. После использо Pu procedure SetKey;

вания этого метода можно изменять [ значения полей, используемые I для поиска записей procedure SetRange(const Задает диапазон отбора записей. Пара Pu Startvalues, EndValues: метр s t a r t v a l u e s определяет значения array of const);

полей для верхней границы диапазона.

Глава 16. Процессор баз данных Borland Database Engine Таблица 16.8 (окончание) Объявление Тип | Описание (прод.) Параметр EndValues определяет значения полей для нижней границы диапазона.

Значения диапазона задаются для полей текущего индекса procedure SetRangeEnd;

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

procedure SetRangeStart;

j После этого метода необходимо задать | значения для полей текущего индекса, ! которые и будут верхней границей Pu | Разблокирует таблицу Paradox или dBASE type TLockType = | для доступа из других приложений (itReadLock, ltWriteLock) procedure UnlockTable(LockType:

TLockType);

Компонент TQuery Компонент TQuery реализует все основные функции стандартного компо нента запроса, описанные в гл. 12. Прямым предком компонента является Класс TDBDataSet.

Для подключения к базе данных используется свойство DatabaseName, в ко тором задается псевдоним BDE или путь к базе данных.

Текст запроса определяется свойством SQL, ДЛЯ задания которого применя ется простой редактор, открывающийся при щелчке на кнопке свойства в Инспекторе объектов (рис. 16.6).

Для управления текстом запроса во время выполнения приложения можно ИСПОЛЬЗОВаТЬ ВОЗМОЖНОСТИ Класса T S t r i n g s.

Основные свойства и методы компонента TQuery представлены в табл. 16.9.

Таблица 16.9. Свойства и методы компонента TQuery Тип I Описание Объявление Свойства При значении True запрещает внесение property Constrained: Pb в набор данных таких значений, которые Boolean;

не соответствуют условиям отбора запро са. Применимо для локальных БД Часть IV. Технологии доступа к данным Таблица 16.9 (продолжение) Объявление Тип Описание p r o p e r t y DataSource: Pb Ссылается на компонент TDataSource, TDataSource;

из набора данных которого задаются значения параметров p r o p e r t y L o c a l : Boolean;

Ro Значение True означает, что запрос обращается к локальной таблице p r o p e r t y ParamCheck: Pb При значении True параметры запроса Boolean;

обновляются при изменении свойства SQL во время выполнения Возвращает число параметров в запросе property ParamCount: Word;

Ro Индексированный список объектов property Params[Index: Pb TParams, каждый из которых соответствует Word]TParams;

одному параметру запроса property Prepared: Boolean;

| Pu Возвращает результат выполнения опера ции подготовки запроса к выполнению property RequestLive: При значении False результат запроса Pb Boolean;

нельзя редактировать, независимо от того, редактируемый результат или нет. При значении True результат запроса можно редактировать, но только если он "живой" p r o p e r t y RowsAffected: Ro Возвращает число модифицированных Integer;

записей набора данных с момента по следнего выполнения запроса p r o p e r t y SQL: T S t r i n g s ;

Pb Содержит текст запроса p r o p e r t y SQLBinary: PChar;

Pu Внутреннее свойство для обеспечения работы с BDE p r o p e r t y StmtHandle: Ro Возвращает экземпляр объекта, соответ HDBIStmt;

ствующего запросу в BDE. Используется при прямом вызове функций BDE Ro p r o p e r t y Text: PChar;

Указатель на символьный массив, содер жащий передаваемый в BDE текст запроса Pb property UniDirectional: Определяет тип используемого курсора Boolean;

данных Методы procedure ExecSQL;

Pu Выполняет запрос без открытия набора данных Глава 16. Процессор баз данных Borland Database Engine Таблица 16.9 (окончание) Объявление Тип | Описание Pu | Заполняет списки параметров метода procedure I экземплярами объектов полей двух GetDetailLinkFields | таблиц запроса, находящихся в отноше (MasterFields, ! нии "один-ко-многим" DetailFields: TList);

override;

Pu | Возвращает ссылку на экземпляр объекта function ParamByName(const | параметра с именем, переданным Value: string): TParam;

| в параметре Value Pu I Готовит запрос к выполнению procedure Prepare;

Pu | Освобождает ресурсы, занятые при подго procedure UnPrepare;

| товке запроса к выполнению S L C * F O Ordersl EE T R M :;

flK Cancel;

C d E t U •' o e db i Рис 16.6. Редактор свойства SQL компонента TQuery КомпонентTStoredProc Компонент TStoredProc обеспечивает использование в приложениях BDE хранимых процедур. Прямым предком компонента является класс TDBDataSet. Поэтому результатом выполнения хранимой процедуры может быть не только одиночный результат, но и полноценный набор данных.

Основные функции компонента TStoredProc соответствуют возможнос тям стандартного компонента хранимой процедуры, описанного в гл. 12.

Свойства и методы компонента TStoredProc представлены в табл. 16.10.

Средствами классов-предков выполняется и подключение компонента к базе данных. Свойство DatabaseName определяет базу данных.

Часть IV. Технологии доступа к данным Свойство storedProcName задает имя хранимой процедуры.

Перед выполнением хранимую процедуру необходимо подготовить. В част ности, на этом этапе осуществляется передача параметров и выделение ре сурсов. Эта операция выполняется автоматически при использовании мето дов ЕхесРгос И Open, И И задается Я Н методом Prepare.

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

Таблица 16.10. Свойства и методы компонента TStoredProc Описание Объявление Тип Свойства Идентификатор процедуры. Используется Pb property Overload: Word;

только для сервера Oracle Определяет порядок присваивания значе type TParamBindMode = Pb ний параметров:

(pbByName, pbByNumber);

• pbByName — по именам параметров;

property ParamBindMode:

TParamBindMode;

• pbByNumber — по номерам параметров в списке свойства Params Ro Возвращает общее число параметров property ParamCount: Word;

Индексированный список параметров property Params: TParams;

Pb Возвращает значение True, если property Prepared: Boolean;

Pu подготовка процедуры уже проводилась Дескриптор выражения BDE. Использует property StmtHandle: Ro ся при прямом вызове функций BDE HDBIStmt;

Содержит имя хранимой процедуры Pb property StoredProcName:

string;

Методы procedure CopyParams(Value: Копирует параметры из списка Value Pu TParams);

function При значении True параметры хранимой Pu DescriptionsAvailable: процедуры доступны из приложения Boolean;

procedure ExecProc;

Передает на сервер сигнал для запуска Pu хранимой процедуры Глава 16. Процессор баз данных Borland Database Engine Таблица 16.10 (окончание) Объявление Описание Тип procedure GetResults;

Pu Возвращает выходные параметры в при ложение (используется только для серве ра Sybase) Pu function ParamByName(const Возвращает параметр с именем Value Value: s t r i n g ) : TParam;

Готовит процедуру к выполнению procedure Prepare;

Pu Освобождает ресурсы, использованные procedure UnPrepare;

Pu во время подготовки процедуры Резюме Процессор баз данных Borland Database Engine 5 реализует стандартные функции доступа к данным и является ПО промежуточного слоя между приложением и базой данных. При помощи системы драйверов и псевдо нимов BDE обеспечивает универсальный способ доступа к данным.

Специальный набор компонентов доступа к данным Delphi использует BDE. Но при необходимости разработчик может применять функции API BDE напрямую.

ГЛАВА Технология dbExpress Одной из проблем различных технологий доступа к данным, используемым в приложениях Delphi, является трудность распространения готовых прило жений. Для BDE требуется отдельная установка, которая занимает порядка 15 Мбайт дискового пространства, а также специальная настройка псевдо нимов (см. гл. 16). ADO предустановлена в операционной системе, но нуж дается в настраиваемых провайдерах данных (см. гл. 19). При необходимо сти обновить версию ADO, дистрибутив вашего приложения "потяжелеет" более чем на 2 Мбайт.

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

с Примечание Проблема редактирования данных в dbExpress может быть решена нескольки ми путями (см. ниже). Однако любые предлагаемые способы повышают затра ты на программирование и снижают эффективность полученного кода.

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

Для функционирования компонентов dbExpress необходим только один драйвер, который взаимодействует напрямую с клиентским программным обеспечением для выбранного сервера БД. В поставку входят драйверы для первых четырех из списка серверов баз данных:

• DB2;

• InterBase;

Глава 17. Технология dbExpress П MySQL;

• Oracle;

• Microsoft SQL Server 2000.

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

Кроме того, технология dbExpress обеспечивает доступ к данным в кросс платформенных приложениях для Windows и Linux, т. к. применяется и в Delphi и Kylix (см. гл. 4), а способы ее применения идентичны.

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

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

Компоненты dbExpress располагаются в Палитре компонентов на одно именной странице.

В этой главе рассматриваются следующие вопросы:

• настройка соединений с различными серверами баз данных, подключе ние драйверов и установка их параметров;

• способы использования компонентов dbExpress для просмотра данных и создание пользовательского интерфейса приложений;

• программная реализация редактирования данных;

П работа с данными в режиме кэширования изменений и использование компонента TSimpleDataSet;

• использование интерфейсов;

П распространение приложений с интегрированной технологией dbExpress.

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

426 Часть IV. Технологии доступа к данным Таблица 17.1. Драйверы dbExpress Драйвер Сервер БД Клиентское ПО DB2 Dbexpdb2.dll. Db2cli.dll InterBase Dbexpint.dll GDS32.DLL Informix Dbexpinf.dll lsqlbO9a.dll Microsoft SQL Server 2000 Dbexpmss.dll OLE DB MySQL Dbexpmys.dll LIBMYSQL.DLL Oracle Dbexpora.dll OCI.DLL Перечисленные в табл. 17.1 файлы находятся в папке \Delphi7\Bin.

Для доступа к данным сервера драйвер должен быть установлен на компью тере клиента. Для доступа к данным драйвер взаимодействует с клиентским ПО сервера, которое также должно быть инсталлировано на клиентской стороне.

Стандартные настройки для каждого драйвера хранятся в файле \Borland Shared\DBExpress\dbxdrivers.ini.

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

После переноса этого компонента в модуль данных или на форму необхо димо выбрать тип сервера и настроить параметры соединения.

Свойство property ConnectionName: string;

позволяет выбрать из выпадающего списка конкретное настроенное соеди нение. По умолчанию разработчику доступно по одному настроенному со единению для каждого сервера БД. После выбора соединения автоматиче ски устанавливаются значения свойств:

П property DriverName: string;

определяет используемый драйвер;

П property LibraryName: string;

задает динамическую библиотеку драйвера dbExpress;

Глава 17. Технология dbExpress О property VendorLib: string;

определяет динамическую библиотеку клиентского ПО сервера (табл. 17.1);

• property Params: TStrings;

список этого свойства содержит настройки для выбранного соединения.

При необходимости все перечисленные свойства можно установить допол нительно.

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

Для этого используется специализированный Редактор соединений dbExpress Connections (рис. 17.1). Он открывается после двойного щелчка на компо ненте TSQLConnection или выбора команды Edit Connection Properties из всплывающего меню компонента.

17чdbEKpress Connections: C:\Programfiles-Common riles Rorland 5h...|3l Biivet Name Connection Setting» Key (Value - BlobSize Connection Name Database DBNAME В Connection DriveiName DB nformixConnection ErrorResourceFile MSSQLConnection MyS Q [-Connection LocaleCode 0x QracleConnection Password password DB2 Translsolation ReadCommited User_Name user Цф OK. Cancel Рис. 17.1. Окно редактора настроенных соединений компонента TSQLConnection В списке слева располагаются существующие соединения. В правой части для выбранного соединения отображаются текущие настройки. При помо щи кнопок на Панели инструментов можно создавать, переименовывать и удалять соединения. Настройки также можно редактировать.

Список соединений в левой части соответствует списку выбора свойства ConnectionName в Инспекторе объектов. Настройки соединения из правой части отображаются в свойстве Params.

Настроенные соединения и их параметры сохраняются в файле \Borland Shared\DBExpress\dbxconnections.ini.

Часть IV. Технологии доступа к данным Примечание При установке Delphi 7 поверх Delphi 6 сведения о соединениях из старого файла dbxconnections.ini добавляются в новый.

Конкретные значения настроек соединений зависят от используемого сер вера БД и требований приложения (табл. 17.2).

Таблица 17.2. Настройка соединения dbExpress Параметр Значение Общие настройки BlobSize I Задает ограничение на объем пакета данных для дан | ных BLOB DriverName j Имя драйвера ErrorResourceFile | Файл сообщений об ошибках I Код локализации, определяющий влияние националь LocaleCode | ных символов на сортировку данных User_Name Имя пользователя Password Пароль DB Имя клиентского ядра Database DB2 T r a n s l s o l a t i o n | Уровень изоляции транзакций Informix HostName | Имя компьютера, на котором работает сервер Informix Informix Translsolation | Уровень изоляции транзакции Trim Char | Определяет, нужно ли удалять из строковых значений | полей пробелы, дополняющие значение до полной | строки, заданной размером поля данных Interbase I Задает поведение курсора по завершении транзак CommitRetain j ции. При значении True курсор обновляется, иначе — I удаляется | Имя файла базы данных (файл GDB) Database InterBase Translsolation I Уровень изоляции транзакции | Роль пользователя RoleName SQLDialect | Используемый диалект SQL. Для IntreBase 5 возмож | но только одно значение - Глава 17. Технология dbExpress Таблица 17.2 (окончание) Параметр Значение Определяет, нужно ли удалять из строковых значений Trim Char полей пробелы, дополняющие значение до полной строки, заданной размером поля данных Разрешение на ожидание занятых ресурсов WaitOnLocks Microsoft SQL Server Имя базы данных Database Имя компьютера, на котором работает сервер MS SQL HostName Server Уровень изоляции транзакции M S L Translsolation SQ Использование учетной записи текущего пользовате OS Autenification ля операционной системы (домена или Active Directory) при доступе к ресурсам сервера MySQL Имя базы данных Database Имя компьютера, на котором работает сервер MySQL HostName Oracle Флаг завершения транзакции. Устанавливается толь AutoCommit ко сервером Задает режим завершения запроса. При значении BlockingMode True соединение дожидается окончания запроса (синхронный режим), иначе — начинает выполнение следующего (асинхронный режим) Запись базы данных в файле TNSNames.ora Database Поддержка управлением несколькими транзакциями Multiple Transaction в одной сессии Уровень изоляции транзакций Oracle Translsolation Использование учетной записи текущего пользовате OS Autenification ля операционной системы (домена или Active Directory) при доступе к ресурсам сервера Определяет, нужно ли удалять из строковых значений Trim Char полей пробелы, дополняющие значение до полной строки, заданной размером поля данных После выбора настроенного соединения или выбора типа сервера и на стройки параметров соединения компонент TSQLConnection готов к работе.

430 Часть IV. Технологии доступа к данным Свойство property Connected: Boolean;

открывает соединение с сервером при значении True. Аналогичную опера цию выполняет метод procedure Open;

После открытия соединения все компоненты dbExpress, инкапсулирующие наборы данных и связанные с открытым компонентом TSQLConnection, по лучают доступ к базе данных.

Соединение закрывается тем же свойством connected или методом procedure Close;

При открытии и закрытии соединения разработчик может использовать об работчики событий property BeforeConnect: TNotifyEvent;

property AfterConnect: TNotifyEvent;

property BeforeDisconnect: TNotifyEvent;

property AfterDisconnect: TNotifyEvent;

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

procedure TForml.MyConnectionBeforeConnect(Sender: TObject);

begin if MyConnection.Params.Values['User_Name']) <> DefaultUser then begin MessageDlg('Wrong user name', mtError, [mbOK], 0);

Abort;

end;

end;

Свойство property LoginPrompt: Boolean;

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

О текущем состоянии соединения можно судить по значению свойства TConnectionState = (csStateClosed, csStateOpen, csStateConnecting, csStateExecuting, csStateFetching, csStateDisconnecting);

property ConnectionState: TConnectionState;

Параметры соединения можно настраивать на этапе разработки в Инспек торе объектов или Редакторе соединений (см. рис. 17.1). Также это можно Глава 17. Технология dbExpress сделать и непосредственно перед открытием соединения, используя свойст во Params И И метод Л procedure LoadParamsFromlniFile(AFileName : String = " ) ;

который загружает заранее подготовленные параметры из INI-файла.

Проверить успешность этой операции можно при помощи свойства property ParamsLoaded: Boolean;

значение True которого сигнализирует об успехе загрузки.

procedure TForml.StartBtnClick(Sender: TObject);

begin if MyConnection.Params.Values['DriverName1] = '' then MyConnection.LoadParamsFromlniFile('c:\Temp\dbxalarmconnections.ini');

if MyConnection.ParamsLoaded then try MyConnection.Open;

except MessageDlg('Database connection error', mtError, [mbOK], 0);

end;

end;

Управление наборами данных Компонент TSQLConnection позволяет выполнять некоторые операции с под ключенными наборами данных и следить за их состоянием.

Свойство property DataSetCount: Integer;

возвращает число подключенных через данное соединение наборов данных.

Но это только активные наборы данных, переданные в связанные компо ненты. Общее число выполняющихся в настоящий момент запросов воз вращает свойство property ActiveStatements: LongWord;

Если сервер БД установил для данного соединения максимальное число од новременно выполняющихся запросов, то оно доступно в свойстве property MaxStmtsPerConn: LongWord;

Поэтому перед открытием набора данных можно выполнять следующий код, который повысит надежность приложения:

if MyQuery.SQLConnection.ActiveStatements <= MyQuery.SQLConnection.MaxStmtsPerConn 432 Часть IV. Технологии доступа к данным then MyQuery.Open else MessageDlg('Database connection is busy', mtWarning, [mbOK], 0);

В случае возникновения непредвиденной ситуации все открытые через дан ное соединение наборы данных можно быстро закрыть методом procedure CloseDataSets;

без разрыва соединения.

При необходимости компонент TSQLConnection может самостоятельно вы полнять запросы SQL, не прибегая к помощи компонента TSQLQuery или TSQLDataSet. Для этого предназначена функция function Execute (const SQL: string;

Params: TParams;

ResultSet:Pointer=nil): Integer;

Если запрос должен содержать параметры, то необходимо сначала создать объект — список параметров TParams и заполнить его. При этом, т. к. объект TParams еще не связан с конкретным запросом, важен порядок следования параметров, который должен совпадать в списке TParams и в тексте SQL.

Если запрос возвращает результат, метод автоматически создает объект типа TCustomSQLDataSet и возвращает указатель на него в параметр Resuitset.

Функция возвращает число обработанных запросом записей. Следующий фрагмент кода иллюстрирует применение функции Execute.

procedure TForml.SendBtnClick(Sender: TObject);

var FParams: TParams;

FDataSet: TSQLDataSet;

begin FParams := TParams.Create;

try FParams.Items[0].Aslnteger := 1234;

FParams.Items[1].AsInteger := 6751;

MyConnection.Execute{'SELECT * FROM Orders WHERE OrderNo >= :Ord AND EmpNo = :Emp', FParams, FDataSet);

if Assigned(FDataSet) then with FDataSet do begin Open;

while Not EOF do begin Next;

end;

Close;

end;

Глава 17. Технология dbExpress finally FParams.Free;

end;

end;

Если запрос не имеет настраиваемых параметров и не возвращает набор данных, можно использовать функцию function ExecuteDirect(const SQL: string): LongWord;

которая возвращает 0 в случае успешного выполнения запроса или код ошибки.

Метод procedure GetTableNames(List: TStrings;

SystemTables: Boolean = False);

возвращает список таблиц базы данных. Параметр SystemTables позволяет включать в формируемый список List системные таблицы.

Метод GetTableNames дополнительно управляется свойством TTableScope = (tsSynonym, tsSysTable, tsTable, tsView);

TTableScopes = set of TTableScope;

property TableScope: TTableScopes;

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

Для каждой таблицы можно получить список полей, использовав метод procedure GetFieldNames(const TableName: String;

List: TStrings);

и список индексов при помощи метода procedure GetlndexNames(const TableName: string;

List: TStrings);

В обоих методах список возвращаемых значений содержится в параметре List.

Аналогичным образом метод procedure GetProcedureNames(List: TStrings);

возвращает список доступных хранимых процедур, а метод procedure GetProcedureParams(ProcedureName: String;

List: TList);

определяет параметры отдельной процедуры.

434 Часть IV. Технологии доступа к данным Транзакции Подобно своим аналогам в BDE и ADO компонент TSQLConnection поддер живает механизм транзакций и делает это сходным образом.

Начало, фиксацию и откат транзакции выполняют методы procedure StartTransaction(TransDesc: TTransactionDesc);

procedure Commit(TransDesc: TTransactionDesc);

procedure Rollback(TransDesc: TTransactionDesc);

При этом запись TTransactionDesc возвращает параметры транзакции:

TTransIsolationLevel = (xilDIRTYREAD, xilREADCOMMITTED, xilREPEATABLEREAD, xilCUSTOM);

TTransactionDesc = packed record TransactionID : LongWord;

GloballD : LongWord;

IsolationLevel : TTransIsolationLevel;

Customlsolation : LongWord;

end;

Запись содержит уникальный в рамках соединения идентификатор транзак ции TransactionID И уровень ИЗОЛЯЦИИ транзакции IsolationLevel. При уровне изоляции XHCUSTOM определяется параметр Customlsolation. Иден тификатор GiobaiiD используется при работе с сервером Oracle.

Некоторые серверы БД не поддерживают транзакции, и для определения этого факта используется свойство property TransactionsSupported: LongBool;

Если соединение уже находится в транзакции, свойству property InTransaction: Boolean;

присваивается значение True. Поэтому, если сервер не поддерживает мно жественные транзакции, всегда полезно убедиться, что соединение не об служивает начатую транзакцию:

var Translnfo: TTransactionDesc;

if Not MyConnection.InTransaction then try MyConnection.StartTransaction(Translnfo);

{.}..

MyConnection.Commit(Translnfo);

except MyConnection.Rollback(Translnfo);

end;

Глава 17. Технология dbExpress Использование компонентов наборов данных Набор компонентов dbExpress, инкапсулирующих набор данных, вполне обычен и сравним с аналогичными компонентами BDE, ADO, InterBase Express. Это компоненты TSQLDataSet, TSQLTable, TSQLQuery, TSQLStoredProc.

) ( Примечание Компонент TSimpleDataSet также относится к рассматриваемой группе, но т. к.

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

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

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

Также здесь недоступны любые операции, требующие буферизации дан ных — это поиск, фильтрация, синхронный просмотр.

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

ДН Отображение данных при помощи компонентов со страницы Data Controls также ограничено. Нельзя использовать компоненты TDBGrid и TDBCtriGrid, а в компоненте TDBNavigator не забудьте отключить кнопки возврата на од ну позицию назад и перехода на последнюю запись. Также ничего хорошего не получится из попытки применить компоненты синхронного просмотра.

Остальные компоненты можно использовать обычным способом (см. гл. 15).

Основные способы применения компонентов dbExpress остаются стандарт ными и подробно описаны в части III.

Доступ к данным во всех рассматриваемых компонентах осуществля ется одинаково — через соединение, инкапсулированное компонентом TSQLConnection. Привязывание к соединению выполняет свойство property SQLConnection: TSQLConnection;

Рассмотрим теперь компоненты dbExpress подробнее.

Класс TCustomSQLDataSet Так как общим предком компонентов dbExpress объявлен класс TDataSet, то задачей класса TCustomSQLDataSet является не столько внесение новой 436 Часть IV. Технологии доступа к данным функциональности, сколько корректное ограничение возможностей, зало женных в TDataSet. Непосредственно в приложениях этот класс не исполь зуется, но информация о нем полезна для понимания других компонентов dbExpress и для создания собственных компонентов на его основе.

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

П TSQLCommandType = (ctQuery, ctTable, ctStoredProc);

property CommandType: TSQLCommandType;

определяющее тип команды, направляемой серверу;

• property CommandText: string;

содержащее текст команды.

Если серверу передается запрос SQL (CommandType = ctQuery), С О С В В ЙТО CommandText содержит текст запроса. Если это команда на получение табли цы, свойство CommandText содержит имя таблицы, а далее с использованием имени таблицы создается запрос SQL на получение всех полей этой табли цы. Если необходимо выполнить процедуру, свойство CommandText содержит имя этой процедуры.

Текст команды, которая реально передается на сервер для выполнения, содержится в защищенном свойстве property NativeCommand: string;

Для использования в табличном представлении существует свойство property SortFieldNames: string;

определяющее порядок сортировки записей табличного набора данных.

Свойство должно содержать список полей, разделенных точкой с запятой.

Это свойство используется для создания выражения ORDER BY ДЛЯ генери руемой команды.

Для обработки исключительных ситуаций в классах — потомках может быть использовано защищенное свойство property LastError: string;

которое возвращает текст последней ошибки dbExpress.

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

Для этого свойству property NoMetadata: Boolean;

присваивается значение True.

Глава 17. Технология dbExpress Однако пользоваться им нужно осторожно, т. к. для некоторых видов команд метаданные необходимы (это операции с использованием индексов).

Разработчик может управлять процессом получения метаданных. Для этого необходимо заполнить структуру TSchemaType = (stNoSchema, stTables, stSysTables, stProcedures, stColumns, stProcedureParams, stlndexes);

TSchemalnfo = record FType : TSchemaType;

ObjectName : String;

Pattern : String;

end;

Pages:     | 1 |   ...   | 4 | 5 || 7 | 8 |   ...   | 11 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.