Чтение онлайн

ЖАНРЫ

Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil

Востриков С М

Шрифт:

CREATE TABLE "Categories" (

"Id" INTEGER NOT NULL,

"Name" VARCHAR (50) character set WIN1251 collate PXW_CYRL,

"GoodsCount" INTEGER);

/* Unique keys definition */

ALTER TABLE "Categories" ADD CONSTRAINT "PK_Categories" PRIMARY

KEY ("Id");

SET TERM ^ ;

/* Trigger: "AI_Categories_Id" */

CREATE TRIGGER "AI_Categories_Id" FOR "Categories" ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW."Id" IS NULL) THEN

NEW."Id" = GEN_ID("Categories_Id_GEN", 1);

END

^

SET TERM ; ^

CREATE TABLE "Goods" (

"Id" INTEGER NOT NULL,

"Name" VARCHAR (150) character set WIN1251 collate

PXW_CYRL,

"Price" DOUBLE PRECISION,

"IdCategory" INTEGER NOT NULL);

/* Unique keys definition */

ALTER TABLE "Goods" ADD CONSTRAINT "PK_Goods" PRIMARY KEY

("Id");

/* Foreign keys definition */

ALTER TABLE "Goods" ADD CONSTRAINT FK_GOODS FOREIGN KEY

("IdCategory") REFERENCES "Categories" ("Id") ON DELETE CASCADE

ON UPDATE CASCADE;

SET TERM ^ ;

/* Trigger: "AI_Goods_Id" */

CREATE TRIGGER "AI_Goods_Id" FOR "Goods" ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW."Id" IS NULL) THEN

NEW."Id" = GEN_ID("Goods_Id_GEN", 1);

END

^

Очевидна

связь master-detail между таблицами "Categories" и "Goods".

Обратите внимание, что мы с самого начала и в дальнейшем будем использовать особенности SQLDialect 3, который доступен в InterBase начиная с версии 6.0

Для печати прайс-листа мы будем использовать генератор отчетов FastReport f .

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

Рассмотрим с самого начала создание приложения, при помощи которого мы сможем редактировать прайс-лист. Необходимо поместить на форме основной компонент, который позволяет подключаться к базе данных InterBase (TpFIBDatabase) и вызвать редактор этого компонента (рис. 2.14 и 2.15).

Рис 2.14. Вызов редактора TpFIBDataBase

Рис 2.15. Bug редактора компонента TpFIBDataBase

Для подключения к базе как минимум необходимо указать путь (в данном примере это путь к локальному файлу), имя пользователя и пароль. Вы можете проверить правильность заданных параметров, нажав на кнопку Test. Мы также можем задать параметры подключения к базе в run-time, получив путь к базе данных из ini-файла:

procedure TMainForm.FormCreate(Sender: TObject);

begin

with TiniFile.Create('ib_price.ini') do begin

pFIBDatabasel.DBName := ReadString('Options', 'DBPath',

'C:\IBPRICE.GDB');

Free ;

end;

pFIBDatabasel.Open;

end;

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

function Execute(const SQL: string): boolean;

function QueryValue(const aSQL: string;

FieldNo:integer):Variant;

function QueryValueAsStr (const aSQL: string,-

FieldNo:integer): String;

Например,

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

SnowMessage(pFIBDatabasel.QueryValueAsStr('select count("Id")

from "Categories"', 0));

Управление транзакциями

Фактически любые действия с данными должны происходить в контексте той или иной транзакции. Управление транзакциями в FIBPlus осуществляется при помощи компонентов класса TpFIBTransacdon. Все транзакции в FIBPlus являются "явными" (explicit) и запускаются при помощи метода StartTransaction. Тем не менее, чтобы вы могли избежать лишнего кодирования, TpFIBDataSet и TpFIBQuery самостоятельно запускают транзакции, если установлен ключ poStartTrasaction в свойстве Options. Завершать транзакцию в любом случае необходимо явным образом при помощи вызова соответствующих методов: Commit, Rollback, CommitRetaining и RollbackRetaining

Метод CommilRetammg появится в InteiBase только начиная с версии 5.1, а метод RollbaekRetammg - только в версии 6.0.

Планируя внутреннюю организацию транзакций в приложении, необходимо помнить про уровень изоляции транзакций Можно указывать уровень изоляции транзакции явным образом при помощи соответствующих констант InterBase в свойстве TRPaiams или используя заранее заданные уровни изоляции при помощи свойства TPBMode. По умолчанию любой компонент TpTransaction, помещенный на форму, имеет уровень изоляции "Read Committed".

FIBPlus также позволяет создавать и запоминать в системном реестре пользовательские уровни изоляции (свойство UserKmdTransaction) Необходимо вызвать редактор компонента, нажав на нем правой кнопкой мыши, и выбрать пункт "Edit transaction params" (рис. 2.16).

Рис 2.16. Редактор компанента TpFIBTransaction

После нажатия на кнопку New Kind нужно указать название для набора констант и перечислить необходимые константы в поле Settings. Теперь нужно сохранить константы нажатием кнопки Save kind Описания всех констант вы можете узнать в документации к InterBase В дальнейшем, вы можете использовать собственные созданные наборы констант, выбирая названия из списка в свойстве UserKmdTiansaction

Закрытие транзакции также имеет ряд особенностей, которые необходимо иметь в виду разработчикам Если вы закрываете транзакцию вызовом методов Commit или Rollback, то все активные запросы, которые работают в контексте этой транзакции, будут также закрыты. Такое поведение непривычно для разработчиков, ранее использовавших в своих приложениях BDE, где подтверждение транзакции оставляло курсоры открытыми. Нужно подчеркнуть, что механизм, реализованный в BDE, является лишь эмуляцией. То есть фактически завершение транзакции просто вызывало невидимое автоматическое "переоткрытие" всех активных запросов. Кроме того, важно иметь в виду, что все запросы при использовании BDE работают в контексте одной и той же транзакции, в отличие от FDBPlus, где каждый запрос может работать в рамках своей отдельно взятой транзакции.

Поделиться с друзьями: