Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2013, 16:03   #1
__meat__
 
Регистрация: 07.03.2013
Сообщений: 7
Стрелка Ошибка - Column does not belong to referenced table. FireBird+Delphi

Всем доброго времени суток. Товарищи, спасайте!
Задача такая. Есть БД(*.fdb), в которой хранится процедура(insert into) для вставки новых записей в эту БД. В Делфи через SQL-запрос (используется pFIBQuery) запускается процедура, которая берет данные из Edit'ов и вбивает эти данные в соответсвующие поля в БД. Все вроде как должно быть, но на "ExecQuery" прога запинается и выдает такую ошибку:

Код:
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
xxxxx
At line 1, column 19.

где xxxxx - это набор символов которые я ввожу в первый же Edit.
Не пойму, что ему в типах не нравится..., поле в БД, которому присваивается строка из Edit1, имеет тип VARCHAR.
БД создавал в Interbase&Firebird Development Studio.

Вот метаданные таблицы из БД:

Код:
CREATE TABLE RICHLIST (
       FIRSTNAME Varchar(17) NOT NULL,
       SURNAME Varchar(17),
       DATEOFBIRTH Date NOT NULL,
       CAPITAL Integer NOT NULL,
       COUNTRY Varchar(25) NOT NULL,
       RICHID Integer NOT NULL,
       CONSTRAINT PK_RICHLIST PRIMARY KEY (RICHID)
);
Вот собственно сама процедура из БД:

Код:
CREATE OR ALTER PROCEDURE PROCED_RICHLIST (P_FIRSTNAME   Varchar(17),
       P_SURNAME     Varchar(17),
       P_DATEOFBIRTH Date,
       P_CAPITAL     Integer,
       P_COUNTRY     Varchar(25),
       P_RICHID      Integer)
AS 

begin
if (:p_richid<0) then
 begin
 insert into RICHLIST(FIRSTNAME, SURNAME, DATEOFBIRTH, CAPITAL, COUNTRY)
 VALUES (:p_firstname, :p_surname, :p_dateofbirth, :p_capital, :p_country);
 end
 else
  begin
  UPDATE
  RICHLIST
  set
  FIRSTNAME = :p_firstname,
  SURNAME = :p_surname,
  DATEOFBIRTH = :p_dateofbirth,
  CAPITAL = :p_capital,
  COUNTRY = :p_country
  where
  RICHID =:p_richid;
  end
end

Вот код кнопки, которая запускает запрос с процедурой:

Код:
procedure TFResult.Button1Click(Sender: TObject);
begin
try
pFIBDatabase1.Open;
pFIBQuery1.SQL.Text:='execute procedure proced_richlist("'+edit1.Text+'","'+edit2.Text+'","'+DateToStr(DateTimePicker1.Date)+'",'+edit3.Text+',"'+edit4.Text+'",-1)';

pFIBQuery1.Transaction.StartTransaction;
pFIBQuery1.ExecQuery;               // Здесь и вылетает ошибка
pFIBQuery1.Transaction.Commit;
pFIBQuery1.Transaction.Active:=False;

except
      on E: Exception do
      begin
      if pFIBQuery1.Transaction.Active then
         pFIBQuery1.Transaction.Rollback;
         Application.MessageBox(PChar(E.Message), 'Ооошибка', MB_ICONSTOP)
      end;
end;
end;
ЗЫ: FB 2.5.0, Delphi 2009, Windows XP SP3.
Заранее благодарю.
__meat__ вне форума Ответить с цитированием
Старый 28.07.2013, 16:46   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

потому что у тебя происходит INSERT записи
Код:
 insert into RICHLIST(FIRSTNAME, SURNAME, DATEOFBIRTH, CAPITAL, COUNTRY)
 VALUES (:p_firstname, :p_surname, :p_dateofbirth, :p_capital, :p_country);
а при этом RICHID является Первичным ключем и IS NOT NULL ... это поле обязательно для заполнения, а ты в него NULL передаешь
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 28.07.2013, 16:56   #3
__meat__
 
Регистрация: 07.03.2013
Сообщений: 7
По умолчанию

Ясно. Просто RICHID автоинкрементом генерируется, поэтому я думал что в INSERT его не надо загонять. А если попробовать убрать в базе это ограничение IS NOT NUUL?
__meat__ вне форума Ответить с цитированием
Старый 28.07.2013, 16:57   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

убери. (лично я никогда не ставлю)
в таком случае
Цитата:
Просто RICHID автоинкрементом генерируется
будет в тему, а так оно игнорируется
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 28.07.2013, 17:10   #5
__meat__
 
Регистрация: 07.03.2013
Сообщений: 7
По умолчанию

не помогло, все так же.

Но, мне вот на другом форуме посоветовали убрать в запросе двойные кавычки. Ну я убрал, в принципе ничего не изменилось, но... Если раньше ошибка выходила ругаясь сразу на Edit1, не зависимо от того, что бы я туда не вводил. То теперь если ввести в Edit1 какое нибудь число, он Edit1 принимает и начинает ругаться уже на Edit2.
Что бы это могло значить?
__meat__ вне форума Ответить с цитированием
Старый 28.07.2013, 17:44   #6
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

используй параметризированные запросы. проблеммы с кавычками отпадут.
а еще в компонентках FIB+ есть метод ExecWP и ExecProcedure ... ими можно пользоваться для сокращения записи
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 28.07.2013 в 17:55.
Yurk@ вне форума Ответить с цитированием
Старый 28.07.2013, 17:55   #7
__meat__
 
Регистрация: 07.03.2013
Сообщений: 7
По умолчанию

Цитата:
а еще в компонентках FIB+ есть метод ExecWP
а в чем его отличие от ExecQuery?
__meat__ вне форума Ответить с цитированием
Старый 09.09.2013, 18:30   #8
incoming
 
Регистрация: 27.07.2013
Сообщений: 6
По умолчанию

Попробуй вот так:
Код:
create or alter procedure PROCED_RICHLIST (
    P_FIRSTNAME varchar(17),
    P_SURNAME varchar(17),
    P_DATEOFBIRTH date,
    P_CAPITAL integer,
    P_COUNTRY varchar(25),
    P_RICHID integer)
as

begin
  /* Если id с клиента передает в процедуру > 0, то обновляем запись,
     иначе добавляем новую*/
  if (:P_RICHID > 0) then
    update RICHLIST
    set FIRSTNAME = :P_FIRSTNAME,
        SURNAME = :P_SURNAME,
        DATEOFBIRTH = :P_DATEOFBIRTH,
        CAPITAL = :P_CAPITAL,
        COUNTRY = :P_COUNTRY
    where (RICHID = :P_RICHID);
  else
    insert into RICHLIST (
        FIRSTNAME,
        SURNAME,
        DATEOFBIRTH,
        CAPITAL,
        COUNTRY)
    values (
        :P_FIRSTNAME,
        :P_SURNAME,
        :P_DATEOFBIRTH,
        :P_CAPITAL,
        :P_COUNTRY);
end
NOT NULL у ключевого поля RICHID можно не убирать, если на него стоит триггер автоинк.

Из делфей:

Код:
procedure TFResult.Button1Click(Sender: TObject);
begin
try
pFIBDatabase1.Open;

with pFIBQuery1 do
begin
SQL.Text:='execute procedure proced_richlist (:P_FIRSTNAME, :P_SURNAME, :P_DATEOFBIRTH, :P_CAPITAL, :P_COUNTRY, -1)'; 

{Не знаю как точно задаются параметры в Фибах, в ИБ это делается так}

Params.ParamByName('P_FIRSTNAME ').Value := Edit1.text;    //Можно еще определять тип параметра так: .AsString :=
Params.ParamByName(' P_SURNAME').Value := Edit2.text;     // .AsString :=
Params.ParamByName('P_DATEOFBIRTH').Value := DateToStr(DateTimePicker1.Date); // .AsString := DateToStr(DateTimePicker1.Date)
Params.ParamByName('P_CAPITAL ').Value := Edit3.text; // .AsInteger := 
Params.ParamByName('P_COUNTRY').Value := Edit4.text; // .AsString := 

{В твоем коде, когда ты передаешь значения в параметр есть ошибка: Пытаешься передать в целочисленный параметр
процедуры P_CAPITAL строковое значение из Edit3.text, нужно привести его значение к числу, т.е. StrToInt(Edit3.text),
но лучше всего используй параметризированные запросы, как в примере}

Transaction.StartTransaction;
ExecQuery;              
Transaction.Commit;
Transaction.Active:=False;
end;

except
      on E: Exception do
      begin
      if pFIBQuery1.Transaction.Active then
         pFIBQuery1.Transaction.Rollback;
         Application.MessageBox(PChar(E.Message), 'Ооошибка', MB_ICONSTOP)
      end;
end;
end;
incoming вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delphi 2010, ibx, firebird - ошибка при StartTransaction или открытии view - db not open AutoHare БД в Delphi 0 17.11.2010 08:32
нужна одно table где все rows from table 1 но и еще добавленных table 2 Why Помощь студентам 0 20.09.2010 10:29
Программирование под Windows (ошибка), как избежать ошибки Unresolved external '_main' referenced fro DeLure Общие вопросы C/C++ 2 02.03.2008 01:35