IBDataSet и InsertSQL

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
londinium
Сообщения: 27
Зарегистрирован: 17 апр 2006, 14:04

IBDataSet и InsertSQL

Сообщение londinium » 20 июл 2006, 20:43

День добрый, Господа!

Имеется таблица

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

CREATE TABLE REFWORKERS (
    ID       INTEGER NOT NULL,
    SURNAME  VARCHAR(50)
);
Пытаюсь с помощью IBX вставить туда новую запись и пишу так:

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

IBDataSet2->Close();
IBDataSet2->InsertSQL->Clear();
IBDataSet2->InsertSQL->Add("insert into refworkers(id,surname) values((select gen_id(gen_refworkers_id,1)from rdb$database),:surname");
 IBDataSet2->ParamByName("surname")->AsString="Мельник";//тут
 IBDataSet2->Open();
в строке //тут получаю по морде "Empty SQL statement"
Модифицирую извечный русский вопрос:
--где я накрутил и как правильно вставить запись в таблицу

С уважением, Londinium

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 20 июл 2006, 20:58

Параметры TIBDataSet - это параметры его SelectSQL. Все остальные ...SQL про них ничо не знают и оперируют с полями SelectSQL. Которые надобно заполнить и сделать Post. При этом и сработает тот SQL, который подразумевается TIBDataSet.State. А вообще-то букварь по IBX на этом сайте имеется, kdv раз сто бесплатную прямую ссылочку давал.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 20 июл 2006, 21:45

Пытаюсь с помощью IBX вставить туда новую запись и пишу так:
для этого надо использовать IBQuery, а не IBDataSet.
(select gen_id(gen_refworkers_id,1) from rdb$database
вот как напишут такую ... что хоть на стенку вешай. :)
прямо кунсткамеру пора открывать.
и чего вам дался этот rdb$database. в www.ibase.ru/devinfo/generator.htm человеческим же языком написано, как и что делать.

insert into refworkers(id,surname)
values(gen_id(gen_refworkers_id,1) ,:surname;

и ведь черта с два поспоришь - смотрю вот на свою статью, и вижу, что да - в запросах надо сяк, а в процедурах и триггерах - эдак. Пойду допишу статью упомянутым примером, а также подкорректирую, чтобы уж больше никто не подкопался...
Это, к слову, что приспичило gen_id в insert вызывать, хотя так обычно не делают. То есть, нет 100%-ой гарантии, что через месяц ты или другой человек в другом месте не влупит такой же insert только уже без gen_id.

:?

londinium
Сообщения: 27
Зарегистрирован: 17 апр 2006, 14:04

Сообщение londinium » 20 июл 2006, 22:24

и чего вам дался этот rdb$database. в www.ibase.ru/devinfo/generator.htm человеческим же языком написано, как и что делать.

insert into refworkers(id,surname)
values(gen_id(gen_refworkers_id,1) ,:surname;

и ведь черта с два поспоришь - смотрю вот на свою статью, и вижу, что да - в запросах надо сяк, а в процедурах и триггерах - эдак. Пойду допишу статью упомянутым примером, а также подкорректирую, чтобы уж больше никто не подкопался...
Просьба дописать, а тот этот код бегает из книги в книгу.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 июл 2006, 00:03

Просьба дописать, а тот этот код бегает из книги в книгу.
позвольте. я все-таки рискну напомнить, что gen_id - это функция. И никто ее к rdb$database или тем более к select не привязывал.
И в статье про генераторы объяснено, почему запрос идет к rdb$database.
Точно так же можно написать
select gen_id(mygen) from mytable. И почему бы тогда в инсерте так же не написать?
Может быть покажусь грубым, но все-таки надо думать, а не переписывать из книжек и статей слово в слово, да еще и не из тех мест.

Примерно 80% эту самую злосчастную статью про генераторы (и остальные статьи тоже) читают по диагонали.
А в статье есть пример:

"А если новое значение генератора не требуется использовать дальше по ходу процедуры, то можно и еще проще

begin
INSERT INTO TBL VALUES (GEN_ID(X, 1), ...
...
end"

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 21 июл 2006, 08:00

Собственно, мы не одиноки... Я видел как ораклоиды вычисляют 2*2 через SELECT from DUAL.

londinium
Сообщения: 27
Зарегистрирован: 17 апр 2006, 14:04

Сообщение londinium » 21 июл 2006, 10:43

День добрый!
Спасибо, что потыкали
Может быть покажусь грубым, но все-таки надо думать, а не переписывать из книжек и статей слово в слово, да еще и не из тех мест.
Я, собственно, без наездов. Этот код я видел в книжке Холлинворта и т.д. "Borland C++ Builder. Руководство разработчика".
Если не жалко, все-таки расскажите, как с помощью TIBDataSet вставить запись в таблицу.

С уважением, Londinium

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 июл 2006, 11:15

Этот код я видел в книжке Холлинворта
чего нам буржуи какие-то. у нас свой сайт есть :)
Если не жалко, все-таки расскажите, как с помощью TIBDataSet вставить запись в таблицу.
всегда пожалуйста:
www.ibase.ru/devinfo/ibx.htm#ibdataset

Ответить