Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > как создать параметры в TpFIBQuery?


Автор: ksili 30.6.2006, 07:48
В компоненте TpFIBQuery есть свойства Params (на чтение), ParamsCheck и методы ParamByName, ParamCount, ParamExist, ParamName, ParamValue, SetParamValue, SetParamValues. Не могу добавить параметры.
Если просто написать 
Код

pFIBQuery1->ParamValue("p1") = Edit2->Text;

в процессе выполнения пишет, что параметр p1 не существует.
Если написать
Код

pFIBQuery1->SQL->Add("insert into ACOMPS(KOD_A, NAZV_A) values (:p1,:p2)");
pFIBQuery1->ExecWP("p1",Edit2->Text);

то при компиляции пишет ошибку 'Could not find a match for 'TFIBQuery::ExecWP(char*,AnsiString)' 

Автор: Alex 30.6.2006, 08:51
Код

pFIBQuery1->ParamValue("p1") = Edit2->Text;

ParamValue это функция возвращающая значение параметра.
Код

pFIBQuery1->ParamByName("p1")->Value = Edit2->Text;
 

Автор: ksili 30.6.2006, 09:34
Пишу
Код

             pFIBQuery1->ParamByName("p1")->Value = Edit2->Text;
             pFIBQuery1->ParamByName("p2")->Value = Edit1->Text;
             pFIBQuery1->SQL->Clear();
             pFIBQuery1->SQL->Add("insert into ACOMPS(KOD_A, NAZV_A) values (:p1,:p2)");
             pFIBQuery1->ExecQuery();

Все равно на первой же строчке приведённого кода происходит ошибка (в run-time), что параметр p1 не существует. Его в design-time нужно как-то создать! 

Автор: Alex 30.6.2006, 09:41
А откуда программа знает о ваших параметрах когда вы ей еще запрос не задали????

Код

pFIBQuery1->SQL->Clear();
pFIBQuery1->SQL->Add("insert into ACOMPS(KOD_A, NAZV_A) values (:p1,:p2)");
pFIBQuery1->ParamByName("p1")->Value = Edit2->Text;
pFIBQuery1->ParamByName("p2")->Value = Edit1->Text;
pFIBQuery1->ExecQuery();
 

Автор: ksili 30.6.2006, 10:57
Да, так оказалось правильно. Но теперь другая проблема. На самом деле в таблице три поля: KOD_A и NAZV_A текстовые. А поле ID_A автоинкрементное. Поэтому я его не указывал, думал что оно должно само сгенериться. 

При создании структуры базы пользуюсь IBExpert. насколько я понял, чтобы поле было автоинкрементным, надо создать соответствующий генератор, или триггер, или процедуру. Я создал генератор, задал ему начальное значение 1. Поставил в свойствах поля галку USE EXISTING GENERATOR и выбрал генератор. Но почему-то если закрыть таблицу и открыть заново (в IBExpert), эта установка не сохраняется. Поле остаётся не автоинкрементным. 

Как вставить запись с таким полем? Я понимаю, что вопрос банальный. Просто первый раз это делаю. Помню давно делал базу под BDE. Там по-моему такое поле заполнялось автоматически. 

Автор: Alex 30.6.2006, 11:30
Цитата(ksili @  30.6.2006,  11:57 Найти цитируемый пост)
При создании структуры базы пользуюсь IBExpert. насколько я понял, чтобы поле было автоинкрементным, надо создать соответствующий генератор, или триггер, или процедуру. Я создал генератор, задал ему начальное значение 1. Поставил в свойствах поля галку USE EXISTING GENERATOR и выбрал генератор. Но почему-то если закрыть таблицу и открыть заново (в IBExpert), эта установка не сохраняется. Поле остаётся не автоинкрементным. 

Мда, что-то автор IBExpert ни как не поправит эту ошибку, нужно будет им еще разок напомнить о ней.
Создайте триггре перед добавлением для своей таблицы с таким кодом
Код

if (NEW.ID_A is null) then
    NEW.ID_A = GEN_ID(название_генератора, 1);

 

Автор: Ramin 17.7.2006, 11:04
Цитата(Alex @ 30.6.2006,  09:41)
А откуда программа знает о ваших параметрах когда вы ей еще запрос не задали????

Код

pFIBQuery1->SQL->Clear();
pFIBQuery1->SQL->Add("insert into ACOMPS(KOD_A, NAZV_A) values (:p1,:p2)");
pFIBQuery1->ParamByName("p1")->Value = Edit2->Text;
pFIBQuery1->ParamByName("p2")->Value = Edit1->Text;
pFIBQuery1->ExecQuery();

+1 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)