Статьи Королевства Дельфи

Создание базы данных Interbase во время выполнения программы.


Раздел Сокровищница ров Алексей,
дата публикации 01 августа 2002г.
Список используемых имен : DBCreationScript : TIBDataBase;Для создания базы данных необходим экземпляр TIBDataBase, причем Connected = false TSCreationScript : TIBTransaction;Этот экземпляр TIBTransaction необходимо связать с DBCreationScript DSCreationScript : TIBSql;С помощью TIBSql мы просто последовательно выполняем инструкции, перечисленные в SQLScript, фрагмент из которого смотрите в самом низу... SQLScript : TMemo;Старый добрый Memo, который содержит скрипт всей нашей базы данных... Procedure TIBCreationOrder.CreateNewDatabase(Path, User, Pass : String); Var InstructionsList : TStringList; Index, Jndex : Integer; Instruction, Params : String; Begin Screen.Cursor := crHourGlass; With DBCreationScript Do Begin {на этом этапе connected = false} Params.Clear; DataBaseName := Path; Params.Add('USER "' + User + '"'); Params.Add('PASSWORD "' + Pass + '"'); Params.Add('DEFAULT CHARACTER SET WIN1251;'); CreateDataBase; {тут база данных становится активной, опять необходим connected = false} If Connected Then Connected := False; Params.Clear; Params.Add('user_name=' + User); Params.Add('password=' + Pass); {мы создали каркас БД и определились с владельцем, кстати, не забудьте перед этим прописать его в системе} Connected := True; End; InstructionsList := TStringlist.Create; {Обычный TStringlist, каждый элемент которого - отдельная инструкция из SQLScript. В качестве разделителя я использовал #... } Params := Trim(SQLScript.Text); Jndex := 1; For Index := 1 To Length(Params) Do If Params[Index] = '#' Then Begin Instruction := Copy(Params, Jndex, Index - Jndex); InstructionsList.Append(Trim(Instruction)); Jndex := Index + 1; End; TSCreationScript.Active := True; {Активизируем транзакцию и начинаем последовательно создавать нашу БД. Кстати, следите за логикой в самом скрипте. Например, не объявляйте триггеры до создания таблицы :)} With DSCreationScript Do Begin For Index := 0 To InstructionsList.Count - 1 Do Begin {Выполняем каждую инструкцию отдельно. Очень полезно для отлавливания ошибок...} Close; SQL.Clear; SQL.Add(InstructionsList.Strings[Index]); ExecQuery; TSCreationScript.Commit; TSCreationScript.Active := True; {Каждую инструкцию надо подтвердить} End; End; TSCreationScript.Commit; InstructionsList.Free; If DBCreationScript.Connected Then DBCreationScript.Connected := False; Screen.Cursor := crDefault; {База данных со всей бизнес логикой готова} End; Отрывок из содержимого SQLScript :
# - разделитель инструкций Sql; Можете ставить, какой нравится... CREATE TABLE MAILTREE( CODE INTEGER NOT NULL PRIMARY KEY, APARENT VARCHAR(255), ACURRENT VARCHAR(255));# CREATE TABLE MAILBASE( CODE INTEGER NOT NULL PRIMARY KEY, FOLDER VARCHAR(255), ISUNREAD SMALLINT DEFAULT 0, AUTHOR VARCHAR(255), SENDERNAME VARCHAR(1000), SENDERSTYLE VARCHAR(1000), RECIPIENT VARCHAR(1000), SUBJECT VARCHAR(255), MSGSIZE DECIMAL(10, 5), MSGRECIEVED VARCHAR(50), ATTACHMENTS SMALLINT, FILELIST VARCHAR(1000), MSGBODY BLOB);# CREATE GENERATOR MTCODE;# SET GENERATOR MTCODE TO 0;# CREATE GENERATOR MBCODE;# SET GENERATOR MBCODE TO 0;# CREATE TRIGGER ADD_MAILTREE FOR MAILTREE ACTIVE BEFORE INSERT AS BEGIN NEW.CODE = GEN_ID(MTCODE, 1); END;# CREATE TRIGGER ADD_MAILBASE FOR MAILBASE ACTIVE BEFORE INSERT AS BEGIN NEW.CODE = GEN_ID(MBCODE, 1); END;# CREATE TRIGGER UPDATE_MAILTREE FOR MAILTREE ACTIVE BEFORE UPDATE AS BEGIN IF (OLD.ACURRENT <> NEW.ACURRENT) THEN UPDATE MAILBASE SET FOLDER = NEW.ACURRENT WHERE FOLDER = OLD.ACURRENT; END;#



Содержание раздела