Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание БД из приложения или выполнение скрипта [FireBird 1.03]


Адмирал ©   (2004-05-13 17:29:00) 

Подскажите, как можно создать БД из приложения? Или как выполнить скрипт?


Val   (2004-05-14 13:44:00) [1]

может просто скармливать эти скрипты isql.exe?


Desdechado   (2004-05-14 13:40:00) [2]

обработку ошибки напиши свою, это я из готового проекта кусов выдрал, rc_ - это текстовый ресурс, aErr - это просто список строк ошибок


Адмирал   (2004-05-13 20:04:00) [3]

Спасибо за помощь! Завтра - в бой!)


kaif   (2004-05-13 20:03:00) [4]

Возьми IBQuery. Запиши в него такой запрос:

create procedure AAA
as
declare variable i integer;
begin
 exit;
end

И вызови метод ExecSQL.
Убедись, что это работает.


kaif   (2004-05-13 19:58:00) [5]

Процедуры создавать очень просто. Нужно выдрать команду
 CREATE PROCEDURE..... ^ из скрипта. Вот здесь и поможет то, что парсер к этому моменту в курсе, что была когда-то замена
 SET TERM ^;

И этот текст без всякого ^ вставить в IBSQL (IBQuery) и запустить ExecQuery (ExecSQL). И так для каждой команды - отыскивается ее "конец" (текущий терминатор) и команда загружается в IBSQL и запускается на выполнение. Только не забудь отключить проверку параметров ParamCheckу своего IBSQL (или IBQuery). Иначе, если в тексте процедуры встречаются двоеточия (внутренние параметризованные запросы в тексте процедур), то IBSQL (IBQuery) попытается их интерпретировать как параметры самой SQL-команды и скажет Parameter not found.
 Кстати, парсер скриптов IBConsole сделан именно так, как я говорю. То есть руками. Я видел ее исходный текст.


Адмирал   (2004-05-13 19:57:00) [6]

В хранимых процедурах как раз-таки и встречаются эти ";" посреди тела процедуры. Есть же способ как-то выполнять такие команды?


Адмирал   (2004-05-13 19:40:00) [7]

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


Адмирал   (2004-05-13 19:37:00) [8]

Спасибо, завтра начну с этого утро.)
/*сейчас уже не на работе*/

aErr - переменная какого класса?
rc_DBCreateError что-то стандартное?


kaif   (2004-05-13 19:29:00) [9]

Почти все команды, кроме CREATE DATABASE можно выполнять с помощью IBSQL или IBQuery.
 Команду CREATE DATABASE нужно отловить в скрипте, если ты его сам разбираешь на отдельные команды и организовать создание базы с помощью компонента TIBDatabase. Или прямым вызовом функции клиентской библиотеки.
Для создания базы с помощью TIBDatabase нужно в Params прописать не обычные ...=..., а непосредственно фразы синтаксиса команды CREATE DATABASE. Есть такая тонкость. Точнее, какие фразы и как - не помню. Но типа
Params.Text := 'user ''sysdba'' password ''masterkey'' default character set win1251' одной строкой без всяких "равно". Или что-то в этом духе. Указать имя файла базы, протокол. И потом вызвать соответствующий метод компонента, который базу создает. Кажется - TIBDatabase.CreateDatabase.
 Еще учти, если будешь писать свой парсер скрипта, что команд SET TERM тоже не существует. Это команды для твоего парсера, но не для сервера.
 В последней версии IBX есть компонент для исполнения скриптов, но я его еще не пробовал. Можешь с ним поиграться. Может он тоже что-то умеет.


Desdechado   (2004-05-13 19:22:00) [10]

не надо к существующей
    IbDb.DatabaseName := ibDB;
    with IbDb.Params do
    begin
         Clear;
         Add( 'USER "SYSDBA"' );
         Add( 'PASSWORD "masterkey"' );
         Add( 'PAGE_SIZE 4096' );
         Add( 'DEFAULT CHARACTER SET WIN1251' );
     end;
     try
        IbDb.CreateDatabase;
     except
         On E : Exception do
         begin
             aErr.Add( rc_DBCreateError  );
             aErr.Add(  E.Message );
             Screen.Cursor := crArrow;
             exit;
         end;
     end;


Адмирал   (2004-05-13 19:16:00) [11]

Я пытаюсь выполнить CREATE DATABASE с помощью TIBQuery->ExecSQL(); Предварительно приконнектившись к существующей базе, и связав на форме компоненты IBDataBase,IBTransaction и IBQuery. Выдается ошибка с SQL-кодом -503. Что-то типа "не могу подготовить (prepare) запрос с SQL-оператором CREATE DATABASE." Если не коннектиться к существующей базе, то будут другие ошибки типа "база данных не открыта", если не связывать запрос с базой "не назначена БД" и так далее. В InterBase ведь невозможно приконнектиться просто к серверу - надо обязательно указать БД. Может, я что-то делаю не так?


Desdechado   (2004-05-13 18:28:00) [12]

есть компоненты, но можно самому разобрать скрипт на команды DDL (прочие выкинуть) и выполнить их по очереди
создать БД - CREATE DATABASE


Наверх

Титульная страница Поиск, карта сайта Написать письмо