Вставка IBQuery — столбец неизвестен/неподдерживаемая функция

Я пытаюсь вставить строку в базу данных firebird (встроенную), но получаю исключение при вызове:

datamodule1.IBQuery1.prepare

Проект xyz.exe вызвал класс исключения EIBInterBaseError с сообщением «Динамическая ошибка SQL, код ошибки SQL = -206 Неизвестный столбец INDEX_ В строке, столбец 25».

  with datamodule1.IBQuery1 do
  begin
    close; 
    With SQL do
    begin
      clear; 
      Add( 'INSERT INTO MST_EVENTS (eventindex, state_, event_, param_, date_, time_, devID_, gateway_)' );
      Add( 'VALUES (:eventindex, :state_, :event_, :param_, :date_, :time_, :devid_, :gateway_') );
    end;
    //
    GeneratorField.Field := 'Nr_';
    GeneratorField.Generator := 'GEN_MST_EVENTS_ID';
    //
    Params[0].AsInteger := FMst.EventRecordIndex; 
    Params[1].AsSmallInt := FMst.EventRecordState; 
    Params[2].AsString := eventToStr(FMst.EventRecordEvent);          
    Params[3].AsSmallInt := 0;
    Params[4].AsDate := FMst.EventRecordDate; 
    Params[5].AsTime := FMst.EventRecordTime; 
    Params[6].AsLongWord := FMst.EventRecordDevID; 
    Params[7].AsString := FMst.EventRecordIP; 
    //
    if ( prepared = false ) then
      prepare;  //Throws an exception here (SOLVED)
    execSQL;    //Now getting exception here 
  end;

У меня есть следующие компоненты, связанные вместе:

  • IBDatabase
  • IBтранзакция
  • Источник данных
  • IBQuery

Вышеупомянутая проблема решена - Изменить >>

Хорошо, я изменил

Add( 'INSERT INTO MST_EVENTS (eventindex, state_, event_, param_, date_, time_, devID_, gateway_)' ); 

to

Add( 'INSERT INTO MST_EVENTS ("eventindex", "state_", "event_", "param_", "date_", "time_", "devID_", "gateway_")' );

... (поэтому я использую кавычки), и теперь он находит поля, но получает еще одно исключение в строке:

 IBQuery1.execSQL:

Класс исключения EIBClientError с сообщением "Неподдерживаемая функция"

Мои поля:

Nr_        : INTEGER
eventindex : INTEGER
state_     : SMALLINT
event_     : VARCHAR(50)
param_     : SMALLINT
date_      : DATE
time_      : TIME
devID_     : BIGINT
gateway_   : VARCHAR(50)

Версия Firebird — встроенная 32-битная версия 2.5.

Я удалил все параметры строки и даты/времени, но получаю исключение. Используя IBExpert и тот же клиент/сервер .dll, я могу безупречно вставить строку (используя все значения).


person john_who_is_doe    schedule 06.08.2014    source источник
comment
Замедлять. Убедитесь, что все изменения столбцов зафиксированы и все имена столбцов совпадают с именами, указанными в запросе. Использование кавычек должно работать. Что не соответствует, так это имена столбцов devID_ и gateway_. Но трудно сказать, какую версию вы разместили здесь.   -  person TLama    schedule 06.08.2014
comment
@Tlama извините, я изменил код, который вставил сюда, но первая часть проблемы уже решена, теперь столкнулся с другим исключением ...   -  person john_who_is_doe    schedule 06.08.2014
comment
... values ( ... ) - добавить скобки к тексту запроса   -  person Abelisto    schedule 06.08.2014
comment
@Abelisto, извините, да, это еще одна вещь, которую я упустил из вставленного кода, но в редакторе кода все в порядке, так что проблема не в этом.   -  person john_who_is_doe    schedule 06.08.2014
comment
Я отредактировал свой вопрос, так что, надеюсь, ошибок больше нет.   -  person john_who_is_doe    schedule 06.08.2014
comment
Ошибка EIBClientError с сообщением "Неподдерживаемая функция" (и различие между клиентом и сервером с помощью EIBInterBaseError) указывает на то, что вы используете функцию, не реализованную в компоненте.   -  person Mark Rotteveel    schedule 06.08.2014
comment
@MarkRotteveel теперь я «только» получаю исключение «Неподдерживаемая функция», но я оставил название темы как есть, потому что это может помочь найти решение для других, связанных с моей первой проблемой.   -  person john_who_is_doe    schedule 06.08.2014
comment
@tdiop Я понимаю, но хочу указать, что проблема, скорее всего, на стороне клиента, а не на стороне сервера. Но поскольку я не знаю ни Delphi, ни компонента, я не могу дать дополнительную информацию). Я могу предложить попробовать упростить (например, убрать GeneratorField, попробовать без параметров и т. д.) и проверить документацию компонента.   -  person Mark Rotteveel    schedule 06.08.2014
comment
Еще одна подсказка: вызывайте prepare перед установкой значений параметров или не вызывайте его вообще.   -  person Abelisto    schedule 06.08.2014
comment
Неподдерживаемая функция часто может быть связана с используемым драйвером. Убедитесь, что вы используете файл fbclient.dll из папки syswow64, если вы используете 64-разрядный сервер и 32-разрядный клиент. Возможно, ваше соединение использует gds32.dll, что может быть проблемой.   -  person Jason    schedule 07.08.2014
comment
Просто для проверки попробуйте вставить значение Nr_ явно, без использования генератора, и посмотрите, что произойдет.   -  person Wodzu    schedule 07.08.2014
comment
@Jason тот факт, что раньше (со столбцами без кавычек) он получил ошибку с сервера, похоже, указывает на то, что драйвер загружен правильно и работает.   -  person Mark Rotteveel    schedule 07.08.2014
comment
Я пробовал все, что вы, ребята, придумали (спасибо!), но не повезло. Кстати, я использую встроенную 32-битную версию fb 2.5 (также пробовал версию x64, но с ней я даже не могу подключиться к базе данных.   -  person john_who_is_doe    schedule 07.08.2014


Ответы (1)


Решением была смена строки

Params[6].AsLongWord := FMst.EventRecordDevID;

to

Params[6].AsLargeInt := FMst.EventRecordDevID;

Но, пожалуйста, как автоматически увеличить поле «Nr_»?

  with datamodule1.IBQuery1 do
  begin
    close; 
    With SQL do
    begin
      clear; 
      Add( 'INSERT INTO MST_EVENTS (eventindex, state_, event_, param_, date_, time_, devID_, gateway_)' );
      Add( 'VALUES (:eventindex, :state_, :event_, :param_, :date_, :time_, :devid_, :gateway_') );
    end;
    //
    GeneratorField.Field := 'Nr_';
    GeneratorField.Generator := 'GEN_MST_EVENTS_ID';
    //
    Params[0].AsInteger := FMst.EventRecordIndex; 
    Params[1].AsSmallInt := FMst.EventRecordState; 
    Params[2].AsString := eventToStr(FMst.EventRecordEvent);          
    Params[3].AsSmallInt := 0;
    Params[4].AsDate := FMst.EventRecordDate; 
    Params[5].AsTime := FMst.EventRecordTime; 
    Params[6].AsLargeInt := FMst.EventRecordDevID; 
    Params[7].AsString := FMst.EventRecordIP; 
    //
    if ( prepared = false ) then
      prepare;  //Throws an exception here (SOLVED)
    execSQL;    //Now getting exception here 
  end;

Я сделал генератор во фламробине.

введите здесь описание изображения

Но получаю исключение (при вызове execSQL): Ошибка проверки

ИЗМЕНИТЬ >>

Я настроил генератор и триггер BEFORE INSERT в IBExpert:

введите здесь описание изображениявведите здесь описание изображения

И теперь все в порядке.

person john_who_is_doe    schedule 07.08.2014
comment
Вы действительно не должны задавать (а затем отвечать) еще один вопрос в ответе. Я предлагаю вам опубликовать еще один вопрос и ответить на него самостоятельно, а затем удалить эту часть из этого ответа. - person Mark Rotteveel; 07.08.2014
comment
@MarkRotteveel Да, вы правы, но, пожалуйста, позвольте мне оставить это здесь как есть. Я завершил свой вопрос тегом «автоинкремент», так что кто-то может найти ответ и на этот вопрос. В следующий раз я буду более последовательным. - person john_who_is_doe; 08.08.2014