![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание БД из приложения или выполнение скрипта [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