Создание таблицы в Firebird из Lazarus'a

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Reyko
новенький
Сообщения: 15
Зарегистрирован: 05.11.2009 22:48:12
Откуда: Магнитогорск

Создание таблицы в Firebird из Lazarus'a

Сообщение Reyko »

Требуется создать таблицу в пустой базе данных из Лазаря.
Lazarus 0.9.26.2 + Firebird 2.1 + sqldb.
Вот код:

Код: Выделить всё

 SQLQuery1.Transaction:=SQLTransaction1;
     SQLQuery1.DataBase:=IBConnection1;
     DataSource1.DataSet:=SQLQuery1;
     SQLQuery1.Close;
     SQLQuery1.SQL.Clear;
     SQLQuery1.SQL.Text:='CREATE TABLE "MYUSER" ("LOGIN" VARCHAR(30), SURNAME VARCHAR(30), PRIMARY KEY("LOGIN"));';
     SQLQuery1.ExecSQL;
     SQLQuery1.SQL.add('SELECT * FROM "MYUSER";');
     SQLQuery1.Open;

При попытке добавить таблицу Лазарус выдает ошибку : sql error code -104 Token unknown line 2 char 1
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

После первого запроса забыли очистить SQL (SQLQuery1.SQL.Clear).
И Query пытается второй раз выполнить сразу и создание и выборку вот и ругается.
Т.е. ругался он именно на второй запрос select, который шел не как отдельный, а как вторая строка.
Reyko
новенький
Сообщения: 15
Зарегистрирован: 05.11.2009 22:48:12
Откуда: Магнитогорск

Сообщение Reyko »

Если добавить SQLQuery1.SQL.Clear, то лазарь ругается, что такой таблицы не существует:

Код: Выделить всё

Dynamic SQL Error 
SQL Error code -204
table unknown
MYUSER
at line 1 column 10

Я так поняла, что таблица не создалась...
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

Reyko писал(а):Я так поняла, что таблица не создалась...

А транзакцию подтвердили7
Reyko
новенький
Сообщения: 15
Зарегистрирован: 05.11.2009 22:48:12
Откуда: Магнитогорск

Сообщение Reyko »

xcod писал(а):А транзакцию подтвердили7


Вы имели введу это:

Код: Выделить всё

SQLQuery1.ApplyUpdates;
SQLTransaction1.CommitRetaining;
?

Если добавить после SQLQuery1.ExecSQL, то появляется ошибка:

Код: Выделить всё

Project reised exception class 'EDataBaseError' with the message:
Operation cannot be performed on an inactiv dataset
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

попробуйте после

Код: Выделить всё

SQLQuery1.ExecSQL;

сделать

Код: Выделить всё

SQLTransaction1.CommitRetaining;
Reyko
новенький
Сообщения: 15
Зарегистрирован: 05.11.2009 22:48:12
Откуда: Магнитогорск

Сообщение Reyko »

xcod писал(а):попробуйте после

Код: Выделить всё

SQLQuery1.ExecSQL;

сделать

Код: Выделить всё

SQLTransaction1.CommitRetaining;


Спасибо большое! Всё заработало.
Я думала, что SQLTransaction1.CommitRetaining без SQLQuery1.ApplyUpdates не работает и даже не думала использовать их раздельно ...
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Reyko писал(а):Я думала, что SQLTransaction1.CommitRetaining без SQLQuery1.ApplyUpdates не работает и даже не думала использовать их раздельно ...

SQLQuery1.ApplyUpdates нужен, если запрос вернул набор данных, вы их отредактировали и хотите отправить изменения в БД.
Reyko
новенький
Сообщения: 15
Зарегистрирован: 05.11.2009 22:48:12
Откуда: Магнитогорск

Сообщение Reyko »

v-t-l писал(а):SQLQuery1.ApplyUpdates нужен, если запрос вернул набор данных, вы их отредактировали и хотите отправить изменения в БД.

Спасибо за объяснение :)
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

CommitRetaining не рекомендуется использовать, можете потом получить проблемы с транзакциями в БД. лучше просто Commit
Ответить