tSQLQuery.Insert проблема

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

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

tSQLQuery.Insert проблема

Сообщение dunin » 26.02.2010 08:52:57

Господа, выручайте. Сутки ковыряю - не могу понять где что не так.

Таблица:
Код: Выделить всё
SET SQL DIALECT 3;

CREATE GENERATOR GEN_USERS_ID;

CREATE TABLE USERS (
    ID          ID /* ID = INTEGER NOT NULL */,
    NOMAN       BOOL_FALSE DEFAULT 0 /* BOOL_FALSE = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */,
    PARENT_ID   INT_DMN DEFAULT 0 /* INT_DMN = INTEGER */,
    IS_USER     ID DEFAULT 0 NOT NULL /* ID = INTEGER NOT NULL */,
    IS_PARTNER  BOOL_FALSE DEFAULT 0 NOT NULL /* BOOL_FALSE = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */,
    EXP         BOOL_FALSE DEFAULT 0 /* BOOL_FALSE = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */,
    PORYADOK    INT_DMN /* INT_DMN = INTEGER */,
    FIO         VU_128 DEFAULT '' NOT NULL /* VU_128 = VARCHAR(256) */,
    MAIL        VU_064 /* VU_064 = VARCHAR(128) */,
    BODY        VU_512 /* VU_512 = VARCHAR(1024) */
);

ALTER TABLE USERS ADD CONSTRAINT PK_USERS PRIMARY KEY (ID);

SET TERM ^ ;

/* Trigger: USERS_BI */
CREATE OR ALTER TRIGGER USERS_BI FOR USERS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_users_id,1);
end
^

--еще тригеры

SET TERM ; ^


На форме:
PeopleSQL: TSQLQuery;
...
PeopleSQL.SQL
Код: Выделить всё
select
u.id,
u.parent_id,
u.fio as fio,
case when g.fio is null then 'Нет' else g.fio end as boss,
u.body,
u.mail,
u.noman,
u.is_user,
u.is_partner

from users u
left join users g on u.parent_id = g.id


PeopleSQL.insertSQL
Код: Выделить всё
insert into users (fio) values (:fio)


PeopleSQL.updateSQL
Код: Выделить всё
update users set
fio=:fio,
body=:body,
mail=:mail,
noman=:noman,
is_user=:is_user,
is_partner=:is_partner
where
id=:id   


Инсерт работает замечательно. Апдейт работает замечательно. Все бы хорошо, но... инсерт работает ТОЛЬКО на одну запись. Т.е. если вставить >1 записи, то при вызове
Код: Выделить всё
PeopleSQL.ApplyUpdates; // <----- здесь ошибка
MainForm.Base.Transaction.CommitRetaining;

получаем вот такую картинку.
Изображение

Вопрос:
Как разрулить ситуацию / уйти от ошибки? Желательно не используя радикальных методов типа "переходи на ZEOS" или вроде того...
Спасибо.

зы. FireBird 2.1.3 Тригеры в БД отключать пробовал.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: tSQLQuery.Insert проблема

Сообщение Padre_Mortius » 26.02.2010 13:13:51

инсерт работает ТОЛЬКО на одну запись. Т.е. если вставить >1 записи, то при вызове

Пример вставки более одной записи можно увидеть?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: tSQLQuery.Insert проблема

Сообщение dunin » 26.02.2010 13:19:53

Padre_Mortius писал(а):
инсерт работает ТОЛЬКО на одну запись. Т.е. если вставить >1 записи, то при вызове

Пример вставки более одной записи можно увидеть?

Пробовал в двух вариантах:
1. На гриде в нижнем поле стрелка вниз.
2. Кнопель с таким вот обработчиком
Код: Выделить всё
procedure TBookForm.BtnAddClick(Sender: TObject);
begin
  PeopleSQL.Insert;
  EditFIO.SetFocus;
end;

Соответственно или в гриде стрелка вниз более одного раза. Или на кнопку. Результат одинаков

Добавлено спустя 2 минуты 47 секунд:
Не совсем так.//
Стрелка вниз - пишем "Иванов" - стрелка вниз - пишем "Петров" - PeopleSQL.ApplyUpdates - An error...
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: tSQLQuery.Insert проблема

Сообщение Padre_Mortius » 26.02.2010 13:32:14

все правильно. У вас одна запись осталась в режиме Edit, а вы еще одну создаете. Естественно вас и выкидывает с ошибкой
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: tSQLQuery.Insert проблема

Сообщение dunin » 26.02.2010 13:44:11

Тогда так:
Стрелка вниз - пишем "Иванов" - PeopleSQL.ApplyUpdates (ошибки нет, запись из режима Edit выведена (или еще нет?)) - стрелка вниз - пишем "Петров" - PeopleSQL.ApplyUpdates - An error (ВСЕ РАВНО ОШИБКА)...
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: tSQLQuery.Insert проблема

Сообщение eevee » 26.02.2010 20:03:37

Я вставку делал так:
Код: Выделить всё
  sqlquery.SQL.Text := 'INSERT ........................';
  sqlquery.ExecSQL;

  sqlquery.SQL.Text := 'INSERT ........................';
  sqlquery.ExecSQL;

  // and etc...


Добавлено спустя 1 минуту 7 секунд:
P.S. Может я и не о том...
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

Re: tSQLQuery.Insert проблема

Сообщение dunin » 26.02.2010 20:36:41

eevee писал(а):Я вставку делал так:
...

Так-то оно работать будет. Проблема в том, что хочется сделать максимально удобно для пользователя: лежит на форме грид - хочешь добавляй, хочешь правь где хочешь. Как-то так. Перед закрытием датасета ApplyUpdates. Перед дисконектом БД - коммит...
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: tSQLQuery.Insert проблема

Сообщение dunin » 01.03.2010 00:12:19

На тестовом проекте воссоздать ошибку не удалось...

С момента как сел за Lazarus включить отладчик толком так и не получилось. Ну и ладно. Без него тоже кодить можно...

Методом "интуитивного чутья при неработающем отладчике" :| пришел к выво... предположению, что ошибка возникает где-то здесь:
Код: Выделить всё
unit IBConnection;   
...
procedure TIBConnection.PrepareStatement(cursor: TSQLCursor;ATransaction : TSQLTransaction;buf : string; AParams : TParams);
var dh    : pointer;
    tr    : pointer;
    x     : shortint;
begin
  with cursor as TIBcursor do
    begin
    dh := GetHandle;
    if isc_dsql_allocate_statement(@Status[0], @dh, @Statement) <> 0 then
      CheckError('PrepareStatement', Status);
    tr := aTransaction.Handle;
   
    if assigned(AParams) and (AParams.count > 0) then
      buf := AParams.ParseSQL(buf,false,sqEscapeSlash in ConnOptions, sqEscapeRepeat in ConnOptions,psInterbase,paramBinding);

    if isc_dsql_prepare(@Status[0], @tr, @Statement, 0, @Buf[1], Dialect, nil) <> 0 then
      CheckError('PrepareStatement', Status);  // <--- ВЕРОЯТНО ЗДЕСЬ...
...

Могу ошибаться...

Вопрос:
Кто-нибудь сталкивался с чем-то подобным? Куда копать?

Очень хотелось бы разрулить ситуацию без перевода проекта на zeos/UIB/etc... с учетом того сколько уже написал - неделю только переводить буду. И не факт, что все быстро заработает. Время жалко...
Коллеги, хелп!!! :?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: tSQLQuery.Insert проблема

Сообщение dunin » 02.03.2010 15:45:20

dunin писал(а):...
Коллеги, хелп!!! :?

Вопрос закрыт. Начал перевод проекта на UIB компоненты. Аминь. :|
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: MailRu[bot] и гости: 62

Рейтинг@Mail.ru