Sql error code 804 incorrect values within sqlda structure

Sql error code 804 incorrect values within sqlda structure Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля. Обязательно указание:1) типа базы данных (Paradox/Oracle/Interbase и т.п.) 2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)Например: […]

Содержание

  1. Sql error code 804 incorrect values within sqlda structure
  2. exception when using a boolean parameter with an embedded v2.5 server [DNET683] #636
  3. Comments
  4. Error executing a query with a column of length 0 working against the embedded server [DNET60] #71
  5. Comments
  6. Footer
  7. Sql error code 804 incorrect values within sqlda structure

Sql error code 804 incorrect values within sqlda structure

Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля. Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

[телепатический локатор включен]
уж не собираем ли мы вручную SQL-запрос, содержащий вещественные числа/даты, вместо использования параметров?
[телепатический локатор выключен]

Добавлено 29.01.09, 07:24
ага, угадал — не региональные настройки надо менять, а параметры использовать!

Дело, конечно, прошлое, но как показывают наблюдения, многие и сейчас, особенно начинающие, натыкаются на грабли «РЕГИОНАЛЬНЫХ НАСТРОЕК» и, как следствие: «Count of read-write columns does not equal count of values».
Пишет, пишет программер. Понаписал несколько тыщ строк, а тут, бац и облом: «на одной машинке работает, на другой не работает, ПАМАГИТЕ!»
Параметры то, как советует Игорь Акопян, дело хорошее, но не всегда есть возможность или желание переделывать исходники.

А есть простой выход.
Достаточно в один из модулей добавить ниже приведенные строчки и все будет в порядке — не потребуется лазать в региональные настройки, ни переделывать код:

DecimalSeparator и пр. глобальные переменные. Через них можно заменять региональные значения на время работы программы.

Новичкам, работающим с SQL, надо пояснить, что в Delphi разделитель целой и дробной части чисел всегда является точка. Текст запроса — это строка, следовательно, при «ручной сборке» запроса числа необходимо преобразовывать в строковое представление. Этим в Delphi занимаются несколько функций.
Некоторые из них при преобразовании берут делитель из региональных настроек, а в них значением делителя может быть запятая. В тексте запроса тогда вставляется лишняя (или лишние, но достаточно одной) запятая, которая и приводит к ошибке.
Те кто исповедует применения параметров не будут сталкиваться с подобной ошибкой, т.к. параметры имеют числовой или вариантный тип (в случае чисел) и присвоение параметру значения не требует преобразования в строку.

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

Источник

exception when using a boolean parameter with an embedded v2.5 server [DNET683] #636

Submitted by: livioc (livioc)

executing a query with an explicit typed boolean parameter will generate this exception

FirebirdSql.Data.FirebirdClient.FbException: Dynamic SQL Error
SQL error code = -804
Incorrect values within SQLDA structure —> FirebirdSql.Data.Common.IscException: Dynamic SQL Error
SQL error code = -804
Incorrect values within SQLDA structure
at FirebirdSql.Data.Client.Native.FesDatabase.ProcessStatusVector(IntPtr[] statusVector) in C:UsersJiriDocumentsdevelNETProviderworkingProvidersrcFirebirdSql.Data.FirebirdClientClientNativeFesDatabase.cs:line 365
at FirebirdSql.Data.Client.Native.FesStatement.Execute() in C:UsersJiriDocumentsdevelNETProviderworkingProvidersrcFirebirdSql.Data.FirebirdClientClientNativeFesStatement.cs:line 384
at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteCommand(CommandBehavior behavior, Boolean returnsSet) in C:UsersJiriDocumentsdevelNETProviderworkingProvidersrcFirebirdSql.Data.FirebirdClientFirebirdClientFbCommand.cs:line 1221
at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteReader(CommandBehavior behavior) in C:UsersJiriDocumentsdevelNETProviderworkingProvidersrcFirebirdSql.Data.FirebirdClientFirebirdClientFbCommand.cs:line 527

note:with expicit typed parameter i mean:
cmd.Parameters.Add(«@value», FbDbType.Boolean);
cmd.Parameters[0].Value = true;

note2:i’m sending a pull request to github with a failing test for that

The text was updated successfully, but these errors were encountered:

Источник

Error executing a query with a column of length 0 working against the embedded server [DNET60] #71

( Reported by the LLBLGen Customer Support )

Executing a query like this against the embedded server :

select » as emptyField from rdb$database

will cause this exception to be thrown:

Dynamic SQL Error
SQL error code = -804
Incorrect values within SQLDA structure

The field gets described with leght 0 and that is what is being sent to the isc_dsql_fetch call but it’s returning an status of

The status vector has:

The query runs fine against the standalone server.

The text was updated successfully, but these errors were encountered:

Running this queries works as expected:

select ‘ ‘ as emptyField from rdb$database

select null as emptyField from rdb$database

isc_dsql_prepare returns the following XSQLVAR information:

aliasname EMPTYFIELD
ownername
relname
sqldata null
sqlind 0
sqllen 0
sqlname 0
sqlscale 0
sqlsubtype 0
sqltype 452

isc_dsql_fetch gets called with:

aliasname EMPTYFIELD
aliasname_length 32
ownername byte[]
ownername_length 32
relname byte[]
relname_length 32
sqldata 0
sqlind 0
sqllen 0
sqlname byte[]
sqlname_length 32
sqlscale 0
sqlsubtype 0
sqltype 452

One strange thing is that the isc_dsql_fetch is returning the data for the fields in the response but it’s returning an error as well.

Fixed by assigning XSQLVAR.sqldata to an empty buffer of size 0.

The fix should be available now in CVS in both 1.7 and 2.0 sources.

status: Open [ 1 ] => Resolved [ 5 ]

resolution: Fixed [ 1 ]

Fix Version: 2.0.1 [ 10070 ]

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Sql error code 804 incorrect values within sqlda structure

Господа, здравствуйте! Может, кто подскажет правильное соединение с БД Interbase? Я обычно делаю так (через стандартные компоненты): TIBDatabase (с БД), TIBTransactionTIBDatabase, хотя зачем это, не знаю :-)), TIBTable (с TIBDatabase, выбирая конкретную табличку, добавляю все поля через Add All Fields), TDataSourse (с TIBTable), далее TDBGrid и т.д. В результате приходится еще добавлять TIBQuery, где ручками пишу все SQL (на Insert, Update, Delete). Остальные компоненты на закладке Interbase не использую. Нет ли более правильного соединения, где бы не пришлось бы писать все ручками, а использовать стандартные средства для модификации таблицы, предоставляемые TDBGrid и TDBNavigator? Спасибо за внимание, заранее благодарен. Если подскажете, где порядок соединения можно найти в Сети, то тоже нормально. Поля в таблицах разных типов, графику не использую.


Alexandr ( 2003-04-09 08:51 ) [1]


Zacho ( 2003-04-09 08:53 ) [2]


> supersan (09.04.03 08:37)
> TIBDatabase (с БД), TIBTransaction (с TIBDatabase, хотя
> зачем это, не знаю :-))

Что зачем не знаешь ? Если не знаешь, зачем TIBTransaction, то читай какую-нибудь литературу по RDBMS и статьи о транзакциях в IB на http://www.ibase.ru

> В результате приходится еще добавлять TIBQuery, где ручками
> пишу все SQL (на Insert, Update, Delete).

В результате чего ?


> Нет ли более правильного соединения, где бы не пришлось
> бы писать все ручками, а использовать стандартные средства
> для модификации таблицы, предоставляемые TDBGrid и TDBNavigator?
>

«Не писать все ручками» получится только в простейших случаях. «Средства для модификации таблицы» предоставляет не TDBGrid и т.п. а связанный с ним TDataSet (IBTable,IBQuery,IBDataSet). Если тебе нужно выбирать на клиента все записи одной таблицы — используй TIBTable. Правда, в клиент-серверных приложениях это довольно редкий случай. Для запросов сложнее чем SELECT . FROM . используй TIBQuery или TIBDataSet. В некотрых случаях использование TIBQuery — проще, но TIBDataSet — универсальнее.
И что такое в твоем понимании порядок соединения ? Соединения чего ?
И почитай хорошенько хелп по IBX чтобы понимать какие компоненты для чего и чем отличается TIBTable, TIBQuery, TIBDataSet.
Еще советую хорошенько изучить сайт http://www.ibase.ru , особенно http://www.ibase.ru/develop.htm


Карелин Артем ( 2003-04-09 08:54 ) [3]

>TIBTable (с TIBDatabase, выбирая конкретную табличку, добавляю все поля через Add All Fields)
Зачем добавлять все поля?? Достаточно просто не делать это 🙂
И TIBTable советую заменить на TIBQuery с запросом типа Select.
Так все нормально, вот только связав TIBQuery и TIBUpdateSQL можно получить «живой» запрос (прописав необходимые параметризированные запросы в соотв. свойствах TIBUpdateSQL).


El ( 2003-04-09 09:01 ) [4]

Для модификации таблицы существует компонент TIBUpdateSQL
Его связываешь с TIBTable через св-во UpdateObject
В окне редактора TIBUpdateSQL делаешь GenerateSQL и не придется писать все ручками.
Или используй TIBDataSet вместо пары TIBTable и TIBUpdateSQL
A еще лучше переходи на компоненты FIBPlus.


Соловьев ( 2003-04-09 09:50 ) [6]


> где поставить TEdit»ы, а потом в параметры SQL передавать
> набранные пользователем значения. Так?

А зачем тебе DBEdit?


supersan ( 2003-04-09 09:56 ) [7]

Да, кстати, никто, случайно, не знает паролей для установки InfoPower4000Pro или 1stclass3000Pro? Говорят, тоже хорошая штука, я видел проект, где они определенным образом настраиваются, тогда можно модификацию таблицы проводить в Gride и Navigatore (прям как в БД Paradox). К сожалению, проект был на Delphi3, а нужно Delphi5


Zacho ( 2003-04-09 10:00 ) [8]

И без всяких сторонних компонентов можно проводить модификацию таблиц в TDBGrid. Почитай какую-либо литературу по работе с БД в Дельфи.


Соловьев ( 2003-04-09 10:05 ) [9]


> модификацию таблицы проводить в Gride и Navigatore (прям
> как в БД Paradox

Не ври, такого не бывает. Грид только отображает данные, а навигатор только переводит НД в режимы: редактирование и т.д.

А не пойму ты модификацию делаешь в DBGrid или в форме ввода в DBEdit.
В прочем и в том и в другом случае просто связываешь DBEdit или столбцы DBGrid с полями таблицы(как обычно). При модификации таблицы пишешь IBTable.Insert(Edit). ну ты понял.
Или если пользуешься Navigatore и того не надо.
Все остальное TIBUpdateSQL сделает за тебя.

А FIBPlus помоему есть здесь http://www.ibase.ru


supersan ( 2003-04-09 17:00 ) [11]

Наконец-то добрался. Отвечаю на замечания

> Соловьев © (09.04.03 10:05)

> Не ври, такого не бывает. Грид только отображает данные,
> а навигатор только переводит НД в режимы: редактирование
> и т.д.

Я имел в виду, что при нажатии кнопки Insert в TNavigator можно добавить запись в TGrid, а потом запостить нажатием на кнопку Post. Я же этого и хочу добиться. Причем в некоторых таблицах это получается (с полями типа Integer и Varchar), а в других — нет (поля Numeric и Date). Почему так?

> Elvira (09.04.03 10:16)
> А не пойму ты модификацию делаешь в DBGrid или в форме ввода
> в DBEdit.
> В прочем и в том и в другом случае просто связываешь DBEdit
> или столбцы DBGrid с полями таблицы(как обычно). При модификации
> таблицы пишешь IBTable.Insert(Edit). ну ты понял.
> Или если пользуешься Navigatore и того не надо.
> Все остальное TIBUpdateSQL сделает за тебя.
>
> А FIBPlus помоему есть здесь http://www.ibase.ru

Хочу сделать в TGrid, TIBUpdateSQL использовал, сгенерил SQL для вставки и т.п., а оно за меня не делает. Может, что еще не учел?
FIBPlus там действительно есть, но для D3 (freeware). Для D5 их установить не удалось 🙁


supersan ( 2003-04-09 17:08 ) [12]


> Elvira (09.04.03 10:16)

PS Вот, буквально сейчас попробовал добавить запись. Выдает какое-то непереваримое «Project *** raised exception class EIBInterBaseError with message «Dynamic SQL Error SQL error code=-804 Incoorect values within SQLDA structure» и т.д.»
Что это за оно такое, не знаете?


Соловьев ( 2003-04-09 17:09 ) [13]


> Хочу сделать в TGrid, TIBUpdateSQL использовал, сгенерил
> SQL для вставки и т.п., а оно за меня не делает. Может,
> что еще не учел?

IBDataSet — там все легко.


> с полями типа Integer и Varchar), а в других — нет (поля
> Numeric и Date). Почему так?

хоть ошибки выдает?


supersan ( 2003-04-09 17:18 ) [14]


> Соловьев © (09.04.03 17:09)
> IBDataSet — там все легко.

А как его со всеми правильно соединить?

> хоть ошибки выдает?

Выдает (см пред мое замечание)

Ну а что «оно» за тебя должно делать ? Почитай книжки какие-нибудь, чтобы понимать как работать в Дельфи с ДБ. Без элементарных знаний никие FIBPlus не помогут.
В общем, простой пример.
Пусть в БД есть таблица MY_TABLE. В ней есть поля ID (первичный ключ) и SOME_FIELD (какое-то еще поле). Для простоты предположим, что ID заполняется генератором при вставке записи (например в событии OnNewRecord или с помощью свойства GeneratorField) из приложения и редактироваться не может. Для доступа к таблице будем использовать TIBDataSet c иминем IBDataSet. (естественно, должны быть еще TIBDataBase и TIBTransaction). Тогда:
1. Ложим на форму TDataSource. В свойстве DataSet указываем IBDataSet.
2. В свойстве DataSource DBGrid»a указываем этот DataSource.
3. В св-ве SelectSQL у IBDataSet пишем SELECT * FROM MY_TABLE
4. В ModifySQL — UPDATE MY_TABLE SET SOME_FIELD=:SOME_FIELD WHERE/>5. В InsertSQL — INSERT INTO MY_TABLE (ID,SOME_FIELD) VALUES (:ID,:SOME_FIELD)
6. В DeleteSQL — DELETE FROM MY_TABLE WHERE/>И все работает.


Johnmen ( 2003-04-09 17:34 ) [16]

SQLDA — SQL descriptor area
Далее можно привести что, зачем и почему.
Да только в соответствующем .hlp все достаточно разжевано.


supersan ( 2003-04-09 17:38 ) [17]


> Zacho © (09.04.03 17:24)

Попробовал так. При попытке открытия выдает ошибку: «SQL Parse Error: Parameter name expected» Извините, если кажусь глупым, но ведь если бы все шло как задумано, то и вопроса бы не возникло.


supersan ( 2003-04-09 17:40 ) [18]


> Johnmen © (09.04.03 17:34)

В каком именно, извините? И как от такого избавиться? Плиз.


Соловьев ( 2003-04-09 17:40 ) [19]

что в selectSQL написано?


Zacho ( 2003-04-09 17:42 ) [20]

Приведи SelectSQL, ModifySQL,InsertSQL,DeleteSQL и структуру таблицы.
Тогда что-нибудь можно будет сказать.


Johnmen ( 2003-04-09 17:54 ) [21]

Читать, вникать и т.д. ibx.hlp или fibplushelp.hlp
(лучше хелпов объяснить трудно и долго)
Избавление одно — не делать ошибок. )


supersan ( 2003-04-09 18:26 ) [22]


> Zacho © (09.04.03 17:42)
> Приведи SelectSQL, ModifySQL,InsertSQL,DeleteSQL и структуру
> таблицы.
> Тогда что-нибудь можно будет сказать.

Выполняю.База:
/* Domains */
CREATE DOMAIN T_ID AS
INTEGER
NOT NULL;
CREATE DOMAIN T_DATE AS
DATE
NOT NULL;
CREATE DOMAIN T_MONEY AS
NUMERIC(9,2)
NOT NULL;
CREATE DOMAIN T_DELETED AS
CHAR(1)
DEFAULT «0»
COLLATE PXW_CYRL;

/* Tables */
CREATE TABLE SPMINPENS (
ID T_ID,
MONEY T_MONEY,
DATE_MP T_DATE,
DELETED T_DELETED COLLATE PXW_CYRL
);

На ID стоит генератор (его нужно?)
В Delphi5 (!)
TIBDatabase + TIBTransaction + TIBDataset + TDatasource + (TGrid + TNavigator)
В TIBDataset:
InsertSQL.Strings = («INSERT INTO SPMINPENS (Money, Date_MP)
VALUES (:Money,: Date_MP)»)
SelectSQL.Strings = («select ID, MONEY, DATE_MP, DELETED from
SPMINPENS»)
ModifySQL.Strings = («UPDATE SPMINPENS SET (Money=:MONEY,
Date_MP=:DATE_MP) WHERE +»ID»)

(скопировал из файла dfm)
DeleteSQL пока не делал, т.к. надо при удалении не физически удалить, а присвоить полю Deleted значение «1»
Что-нибудь еще нужно?


Zacho ( 2003-04-09 18:44 ) [23]

Во-первых что такое «На ID стоит генератор » ?
Во-вторых InsertSQL должен быть таким INSERT INTO SPMINPENS (ID,MONEY,DATE_MP) VALUES (:ID,:MONEY,:DATE_MP)
В-третьих ModifySQL — UPDATE SPMINPENS SET MONEY=:MONEY, DATE_MP=:DATE_MP WHERE/>И без всяких скобок и «+»


supersan ( 2003-04-10 06:45 ) [24]


> Zacho © (09.04.03 18:44)
> Во-первых что такое «На ID стоит генератор » ?
> Во-вторых InsertSQL должен быть таким INSERT INTO SPMINPENS
> (ID,MONEY,DATE_MP) VALUES (:ID,:MONEY,:DATE_MP)
> В-третьих ModifySQL — UPDATE SPMINPENS SET MONEY=:MONEY,
> DATE_MP=:DATE_MP WHERE/>> И без всяких скобок и «+»

Ага, спасибо. Только следующее.
1. На ID генератор — это значит, что есть
CREATE GENERATOR GEN_SPMINPENS_ID;
SET GENERATOR GEN_SPMINPENS_ID TO 0;

При добавлении стоит триггер, он автоинкрементит это поле. Остальные таблицы при такой же конструкции работают.
2. InsertSQL и ModifySQL исправил. В ModifySQL я «+» не ставил, это Delphi постаралась
3. Все равно данная TIBDataset не открывается. При попытке сделать ее активной выдается ошибка (повторю ее текст):
«SQL Parse Error: Parameter name expected»
Это что за зверь? Насчет SelectSQL нет замечаний (см. )
> supersan (09.04.03 18:26)
?


supersan ( 2003-04-10 09:01 ) [25]

Ничего, что я так рано? У нас просто день уже. Никто не может мне помочь?


Соловьев ( 2003-04-10 10:05 ) [26]


> . В ModifySQL я «+» не ставил, это Delphi постаралась

такого не может быть.


> «SQL Parse Error: Parameter name expected»
> Это что за зверь? Насчет SelectSQL нет замечаний (см.

оставь только SelectSQL.Проверь. Потом добавь InsertSQL. Проверь. И т.д. Выясни в каком у тебя ошибка.


supersan ( 2003-04-10 10:38 ) [27]

ОК, с открытием и с «+» разобрался. Теперь при открытии формы, несмотря на то, что данная IDDataset активна, ни TGrid ни TNavigator не активны. Впечатление такое, что они связаны с закрытым НД. А это почему такая бяка? Или с IDDataset это нормально? Тогда как заактивизировать Grid и Navigator?


supersan ( 2003-04-10 10:55 ) [28]

Sorry, сам накосячил — неправильно подсоединил 🙁 Исправил. Теперь при добавлении выдает ошибку «Field ID must have a value». А это поле — автоинкрементное. Если пытаться добавить запись в WISQL, то генерится ID корректно. В компонентах типа IBTable я устанавливал св-во Required столбца ID в False, тогда поле заполнялось автоматом. А тут как?
Еще раз прошу прощения за предыдущий ляпсус


Соловьев ( 2003-04-10 11:06 ) [29]

property GeneratorField: TIBGeneratorField;


supersan ( 2003-04-10 11:17 ) [30]

Товарищи мои дорогие!
Пожалуйста, кто знает, что такое «Dynamic SQL Error SQL error code = -804 Incorect values within SQLDA structure», возникает при попытке добавления/изменение таблицы SPMINPENS (описание см. выше) > supersan (09.04.03 18:26), а, главное, как от него избавиться и заполнить-таки таблицу эту.
На www.ibase.ru я что-то такое не нашел.
PS Пытаюсь, переведя IBDataset в режим Insert, ввести следующие значения: в поля MONEY и DATE_MP соответственно 200 и 01.01.2001


supersan ( 2003-04-10 11:22 ) [31]


> Соловьев © (10.04.03 11:06)
> property GeneratorField: TIBGeneratorField;

Это где ж такое свойство? В IBDataset нет, по крайней мере, при + его не показывает. Да я нашел, что есть аналогичное (т.е. Required) св-во, его тоже в False — и все ОК. Так что с этим справился. Только остается ошибка (см. пред.)


Соловьев ( 2003-04-10 11:26 ) [32]


> при + его не показывает

при это много чего не показывает, например FieldByName? поэтому же не стоит судить что этого свойства нет. Оно есть например в Object Inspector.


supersan ( 2003-04-10 11:34 ) [33]


> Оно есть например в Object Inspector.

Ну нет его в Object Inspector. Есть что-то похожее, property AutoGenerateValue, его можно установить, в частности, в arAutoInc. Ну это шут с ним. Как насчет ошибки ( > supersan (10.04.03 11:17))?


Соловьев ( 2003-04-10 11:38 ) [34]

Оттестируй свой запрос на изменение в IBConcol, там и найдешь свою ошибку.


supersan ( 2003-04-10 12:23 ) [35]


> Соловьев © (10.04.03 11:38)
> Оттестируй свой запрос на изменение в IBConcol, там и найдешь
> свою ошибку.

Извините, не совсем понял, что имеется в виду. Если имеется в виду TDBGrid, то непонятно, как там тестировать. Если имеется в виду правильность составления SQL, то, повторяю, в WISQL подобный запрос проходит бех проблем
Пример. В WISQL запрос
insert into spminpens (MONEY, DATE_MP) values (100,»01.01.2001″)
Результат:
select * from spminpens

1 100.00 1-JAN-2001 0
В Delphi
IBDataset.InsertSQL:
INSERT INTO SPMINPENS (ID,MONEY,DATE_MP) VALUES (:ID,:MONEY,:DATE_MP)
В TGrid вывожу поля MONEY и DATE_MP, заполняю при добавлении значениями 100 и 01.01.2001 соответственно. Выдается ошибка.
Что не так делаю?


AlexSerp ( 2003-04-10 13:06 ) [36]

Выбрось из вставки ID.


supersan ( 2003-04-10 13:21 ) [37]


> AlexSerp © (10.04.03 13:06)
> Выбрось из вставки ID

Ну сделал, попробовал — все равно фигня (извиняюсь), т.е. та же ошибка. Не в ID дело, как мне кажется, а в том, что, возможно, Interbase неправильно воспринимает заполнение поля типа DATE и/или NUMERIC. Может, с ними надо что-то сделать? Если да, то на что обратить внимание? Елки-палки, неужели только у меня такое дело встретилось? Если у кого получалось заполнение полей типа DATE и/или NUMERIC, опишите соединение компонентов, плиз, и их настройку, тоже плиз. Желательно, если будут только стандартные Дельфовские компоненты, можно из Rx Library. Если нужны какие еще, то подскажите, где взять ( для Delphi 5) и кряки к ним(плиз сто раз). А то, может, вышлите на supersanpovt@mail.ru? Ну господа, вторые сутки бьемся над энтим делом, нешто столь времени нужно на простое (по идее) дело? И большая просьба: может перед подачей совета прочитаете историю переговоров? Там уже много советовали.


AlexSerp ( 2003-04-10 13:45 ) [38]

Посмотри еще региональные настройки на десятичный разделитель и формат даты в системе.


Соловьев ( 2003-04-10 13:55 ) [39]


> :
> INSERT INTO SPMINPENS (ID,MONEY,DATE_MP) VALUES (:ID,:MONEY,:DATE_MP)

может поробовать привести к формату дату? CAST(. as TimeStamp)


supersan ( 2003-04-10 14:11 ) [40]


> Соловьев © (10.04.03 13:55)
> может поробовать привести к формату дату? CAST(. as TimeStamp)

НА ДАТУ ОН КАК РАЗ НЕ РУГАЕТСЯ. Счас попробовал создать две таблички, одна — с DATE, другая — с NUMERIC. Первая заполняется без проблем, причем даже с TIBTable. Вторая и выдает энту самую пресловутую ошибку.


> AlexSerp © (10.04.03 13:45)
> Посмотри еще региональные настройки на десятичный разделитель
> и формат даты в системе

В том-то и дело, что я ввожу число БЕЗ десятичной точки (пока, но потом буду с ней)

Итак, дело в NUMERIC. Будут какие-нибудь соображения на этот счет?

Источник

Модераторы: kdv, CyberMax

Гость

-804 ошибка Firebird

Нарисовал небольшую базульку на Firebird. Делаю к ней кучу запросов. Всё это дело вроде работает но иногда возникает ошибка -804
[20.12.2004 10:49:41]{ERROR}Loading XAS operations cache IBMessage:Dynamic SQL Error.
SQL error code = -804.
SQLDA missing or incorrect version, or incorrect number/type of variables.
SQLMessage:An error was found in the application program input parameters for the SQL statement.
[20.12.2004 10:50:04]{ERROR}Loading XAS operations cache IBMessage:Error reading data from the connection.
SQLMessage:Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.

При чём возникает она если сольно увеличить нагрузку (более 15 запросов в секунду).

Ошибка возникает при вызове tmpQuery->ExecQuery();

Кто-нибудь с таким сталкивался?



Гость

Сообщение

Гость » 20 дек 2004, 11:17

Спасибо за ответ.
Я пользуюсь TpFIBQuery
версия сервера Firebird 1.5.1.4481
версия gds32.dll 1.5.1.4481
Т.е. вероятно я должен быть лишён таких проблем … Может кто-нибудь подскажет что можно сделать что бы этого избежать.

А сообщения об ошибках действительно иногда бывают разные к примеру иногда мне выдаёт типа «Access violation in gds32.dll Приложение обратилось по адресу 00000000 и будет закрыто.»


kdv

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

Сообщение

kdv » 20 дек 2004, 12:06

«более 15 запросов в секунду» — это откуда? ты небось из multithread-приложения запросы дергаешь, не соблюдая правил. см. faq.


Гость

Сообщение

Гость » 20 дек 2004, 12:48

Спасибо. Щас попробую. но в начале уточню.
Т.е. правильно ли я понял, что для каждой транзакции и для каждого запроса необходимо создавать свой экземпляр базы данных (ну в смысле надо для каждой нити TpFIBDatabase, TpFIBTransaction, TpFIBQuery)?


kdv

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

Сообщение

kdv » 20 дек 2004, 13:18

правильно. об этом и талдычит FAQ уже лет шесть-семь.


Гость

Сообщение

Гость » 20 дек 2004, 13:42

Огромное спасибо. Щас на 25 транзакциях в секунду мой комп затыкается гы-гы.
Все работает. Я просто раньше в целях экономии проводил все транзакции через один компонент TpFIBDatabase.
После прочтения FAQ сделал их столько же сколько и транзакций с запросами и никаких ошибок.
Ещё раз спасибо.


getman

Сообщения: 13
Зарегистрирован: 23 ноя 2004, 13:49

Сообщение

getman » 21 дек 2004, 08:38

Anonymous писал(а):Огромное спасибо. Щас на 25 транзакциях в секунду мой комп затыкается гы-гы.
Все работает. Я просто раньше в целях экономии проводил все транзакции через один компонент TpFIBDatabase.
После прочтения FAQ сделал их столько же сколько и транзакций с запросами и никаких ошибок.
Ещё раз спасибо.

Меня терзают смутные сомнения, вот если у меня 20 IBQUERY, естественно вызываются не сразу, а через разные формы, то что мне надо 20 IBTRANSACTION и столько же IBDATABASE? :oops: Или это имеется в виду работа через THread?


kdv

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

Сообщение

kdv » 21 дек 2004, 09:54

getman, не суетись. кто тебя вообще заставляет на каждый IBQuery пихать IBTransaction, пусть даже и при работе с thread???


Я получаю это динамическое предупреждение sql после попытки получить результаты этого запроса:

Предупреждение: ibase_fetch_assoc (): Динамическая ошибка SQL Код ошибки SQL = -804 Неверные значения в структуре SQLDA

SELECT VOORRAADAUTO.*, AUTOMERK.*, VOORRAADAUTO.OMSCHRIJVING as uitvoeringnaam
FROM VOORRAADAUTO
LEFT JOIN AUTOMERK ON AUTOMERK.AUTOMERKID = VOORRAADAUTO.AUTOMERKID
WHERE VOORRAADAUTO.SOORTVOORRAADSTATUSID = 2 AND VOORRAADAUTO.TOTAALCONSUMENT > 0 ORDER BY AUTOMERK.OMSCHRIJVING DESC, VOORRAADAUTO.TOTAALCONSUMENT, VOORRAADAUTO.MODELOMSCHRIJVING;

И этот код PHP:

        $p_sql = ibase_prepare($sql);
$rs = ibase_execute($p_sql);

while($row = ibase_fetch_assoc($rs)){
$auto = new auto($row);
$this->list[] = $auto;
}

Как получаются неправильные значения? И как вы решаете эту проблему?

0

Решение

Вы всегда можете попробовать запустить sql напрямую в базе данных.

Поскольку запрос Sql выглядит нормально, я могу только думать, что, возможно, в названии поля есть опечатка или она не возвращает строки. Или где поля не являются числовыми

Также я могу предложить использовать псевдоним вместо полного имени таблицы, что поможет прочитать запрос.

SELECT V.*, A.*, V.OMSCHRIJVING as uitvoeringnaam
FROM VOORRAADAUTO V
LEFT JOIN AUTOMERK A
ON A.AUTOMERKID = V.AUTOMERKID
WHERE V.SOORTVOORRAADSTATUSID = 2 AND V.TOTAALCONSUMENT > 0
ORDER BY A.OMSCHRIJVING DESC, V.TOTAALCONSUMENT, V.MODELOMSCHRIJVING;

0

Другие решения

Не знаю, если вы уже решили это, но у меня была та же ошибка с простым запросом вроде:

SELECT * FROM "any_Table" WHERE "id"=1

Это сработало для меня после того, как я заменил * на имя столбца:

SELECT "id", "Name" FROM "any_table" WHERE "id"=1

Я думаю, что это как-то связано с драйвером InterBase, я нашел это:
Сообщение об ошибке

Похоже, что клиент php interbase не может обрабатывать логические поля, после того как я изменил логическое поле в целое число, работает select *.

Я использую XAMPP, PHP версии 5.6.15, с interbase XE7 на окнах и использовал gds32.dll из установки interbase (12.0.4.357).

0

@koltsov4

Hi.
php-8.0.1-interbase-1.1.1-linux-x64.so does not work in firebird 4 with DECIMAL or NUMERIC types when using the SUM function. As a result, I get Incorrect values within SQLDA structure.
For example select sum (p.balance) from dog p will not work if the data type is DECIMAL.
Similarly, it does not work if any operations occur inside the sum, for example, if the field is made INTEGER and the following query is executed select sum (p.balance * 100) from dog p similarly we get Incorrect values within SQLDA structure
Also does not work with TIMESTAMP WITH TIME ZONE fields. For example, select * from MON $ ATTACHMENTS will return an error Incorrect values within SQLDA structure

@koltsov4
koltsov4

changed the title
Incorrect values within SQLDA structure in firebird 4

Incorrect values within SQLDA structure in firebird 4 (php-8.0.1-interbase-1.1.1-linux-x64.so)

Nov 1, 2021

@mrotteveel

As a workaround, set DataTypeCompatibility to 3.0 or 2.5 in either firebird.conf (server wide), or per-database in databases.conf. This seems to be the same issues as reported in #24.

@koltsov4

This problem is with 4.0. With 3.0 it works fine.

@mrotteveel

The problem is that Firebird 4.0 introduced wider NUMERIC and DECIMAL (38 digits, previous versions supported 18 digits), and an INT128 type, these get used for some of the aggregate functions and other calculations. The DataTypeCompatibility setting when set to 3.0, will ensure that Firebird 4.0 will not return the new data types, but instead it will convert (cast) them to types as supported by Firebird 3.0. See also the Firebird 4.0 release notes, section DataTypeCompatibility.

To be clear, I don’t maintain the Firebird PHP driver. This is a workaround you can use until this gets fixed in the driver.

@koltsov4

Thanks! Indeed, it helped.

But not quite to the end. For example, TIMESTAMP WITH TIME ZONE is converted to TIMESTAMP, but “select * from MON$ATTACHMENTS” will still not work because there is a type BOLLEAN. “Select p.mon $ wire_compressed from MON$ATTACHMENTS p” will return “Incorrect values within SQLDA structure”. But this is not important, since the structure worked from the old configuration.

PS: it surprised me, because 3.0 also has a BOLLEAN type. I just never used it. Perhaps a similar driver problem exists when working with 3.0.

@mrotteveel

If you do have a boolean somewhere, you need to set DataTypeCompatibility to 2.5, so boolean is also converted. As I said, I don’t maintain the Firebird PHP driver (nor do I use it), so I don’t know all the ins and outs of it.

@MartinKoeditz

The problem is not related to BOOLEAN, but to TIMESTAMP field CREATION_DATE.
If I set DataTypeCompatibility to 3.0 everything works fine.

So I will investigate in the new timezone feature.

@buhlerax

Good Morning,
Any news about the extension’s compatibility with the new firebird 4.0 types?

@MartinKoeditz

Hi,

still in progress. Will last some weeks. Any help is welcome.

Regards,
Martin

[https://www.it-syn.de/wp-content/uploads/2013/03/130313-it-synergy-Logo-200×81.png]

E-Mail: ***@***.***
Festnetz: +49 5131 46358 — 300
Mobil: +49 174 9095174

Adresse:
Dieselstraße 18
30827 Garbsen

Geschäftsführer: Jörg Obermann
USt.-ID: DE266943764
Gerichtsstand: Amtsgericht Hannover HRB 204887
[cid:Synny-standard-122x128_893d5d75-a3d9-4751-8d28-35edcac23c6b.png] <https://www.it-syn.de/>

[cid:Instagram_b049198f-ae33-4adb-8f4c-c93023d156b5.png]<https://www.instagram.com/it.synergy> <https://plus.google.com/114028260526830186292?prsrc=3/> <http://www.youtube.com/codetwochannel#p/u/> [tweeter] <https://www.linkedin.com/company/it-synergy-gmbh>

Vertraulichkeitshinweis: Die in dieser E-Mail enthaltenen Informationen sind vertraulich zu behandeln und sind nur für die Personen oder das Unternehmen bestimmt, an welche sie tatsächlich gerichtet sind. Sollten Sie diese Nachricht aufgrund eines Übermittlungsfehlers erhalten haben, bitten wir Sie den Versender der Nachricht unverzüglich zu informieren. Ebenso bitten wir Sie, den Inhalt Dritten gegenüber vertraulich zu behandeln und ihn nicht weiter zu verbreiten.

Sicherheitshinweis: Das Internet ist kein sicheres Kommunikationsmedium. Im Rahmen unseres Qualitätsmanagements und aller gebotenen Sorgfalt wurden Schritte eingeleitet die einen Virenbefall dieser E-Mail weitgehend ausschließen, aber wegen der Beschaffenheit des Übertragungsmediums nicht garantiert werden können.

Von: Alexandre Pereira Bühler ***@***.***
Gesendet: Donnerstag, 26. Januar 2023 10:32
An: FirebirdSQL/php-firebird ***@***.***>
Cc: Köditz, Martin ***@***.***>; Assign ***@***.***>
Betreff: Re: [FirebirdSQL/php-firebird] Incorrect values within SQLDA structure in firebird 4 (php-8.0.1-interbase-1.1.1-linux-x64.so) (Issue #26)

Good Morning,
Any news about the extension’s compatibility with the new firebird 4.0 types?


Reply to this email directly, view it on GitHub<#26 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/ADEKGLRL3SN6PAYER24YQU3WUJAAHANCNFSM5HDUSXMQ>.
You are receiving this because you were assigned.Message ID: ***@***.******@***.***>>

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    SQL error 804

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    28.01.09, 19:13

      Junior

      *

      Рейтинг (т): 1

      Доброго времени суток!
      Сделал программку для работы с БД FireBird 2.0.1 Программа поочередно конектиться к разным БД и проверяет информацию. Подключение через IBDatabase
      Путь к БД береться через диологовое окно.
      У меня на компьюторе она работает нормально, принес я ее на работу и тут она начала чихать и кашлать.
      На работе на моей машине НЕ установлен FireBird, программа отказывалась открываться вообще. Скопировов в папку с программой gds32.dll, начала открываться, но не хотела выполнять подключене к БД, постоянно вылетела ошибка «Unavailable database». Но к сожелению эту проблему я так и не решил, поставил FireBird 2.0.1 на рабочую машинку. После установки FireBird 2.0.1 программа стала подключаться к БД и выполнять возложенную на нее миссию, счастье мое длилось не долго. Так как после обработки 5 записи в БД она выдала следующую ошибку «SQL Error cod -804 Count of read-write columns does not equal count of values», проверил записи в БД, ничего подозрительного не обнаружил, прийдя домой первым делом полез в код программы, но как не странно там тоже все нормально. Запустил программу, все работает как надо и без ошибок.
      В чем может быть дело?


      AlexFSM



      Сообщ.
      #2

      ,
      29.01.09, 07:12

        Junior

        *

        Рейтинг (т): 1

        И так, после мозгового штурма проблема решилась, ошибка «SQL Error cod -804 Count of read-write columns does not equal count of values» была ликвидирована путем смены РЕГИОНАЛЬНЫХ НАСТРОЕК (разделитель целой и дробной части) вместо «,» надо было поставить «.»


        Игорь Акопян



        Сообщ.
        #3

        ,
        29.01.09, 07:23

          [телепатический локатор включен]
          уж не собираем ли мы вручную SQL-запрос, содержащий вещественные числа/даты, вместо использования параметров?
          [телепатический локатор выключен]

          Добавлено 29.01.09, 07:24
          ага, угадал — не региональные настройки надо менять, а параметры использовать!


          AlexFSM



          Сообщ.
          #4

          ,
          29.01.09, 07:29

            Junior

            *

            Рейтинг (т): 1

            Цитата Игорь Акопян @ 29.01.09, 07:23

            параметры использовать!

            Да? Надо попробовать. :)


            sansans



            Сообщ.
            #5

            ,
            15.03.11, 05:21

              Дело, конечно, прошлое, но как показывают наблюдения, многие и сейчас, особенно начинающие, натыкаются на грабли «РЕГИОНАЛЬНЫХ НАСТРОЕК» и, как следствие: «Count of read-write columns does not equal count of values».
              Пишет, пишет программер. Понаписал несколько тыщ строк, а тут, бац и облом: «на одной машинке работает, на другой не работает, ПАМАГИТЕ!»
              Параметры то, как советует Игорь Акопян, дело хорошее, но не всегда есть возможность или желание переделывать исходники.

              А есть простой выход.
              Достаточно в один из модулей добавить ниже приведенные строчки и все будет в порядке — не потребуется лазать в региональные настройки, ни переделывать код:

              ExpandedWrap disabled

                initialization

                  DecimalSeparator := ‘.’;

                  DateSeparator := ‘.’; //на всякий случай

                end.

              DecimalSeparator и пр. глобальные переменные. Через них можно заменять региональные значения на время работы программы.

              Новичкам, работающим с SQL, надо пояснить, что в Delphi разделитель целой и дробной части чисел всегда является точка. Текст запроса — это строка, следовательно, при «ручной сборке» запроса числа необходимо преобразовывать в строковое представление. Этим в Delphi занимаются несколько функций.
              Некоторые из них при преобразовании берут делитель из региональных настроек, а в них значением делителя может быть запятая. В тексте запроса тогда вставляется лишняя (или лишние, но достаточно одной) запятая, которая и приводит к ошибке.
              Те кто исповедует применения параметров не будут сталкиваться с подобной ошибкой, т.к. параметры имеют числовой или вариантный тип (в случае чисел) и присвоение параметру значения не требует преобразования в строку.

              Сообщение отредактировано: sansans — 15.03.11, 05:39


              joiner



              Сообщ.
              #6

              ,
              15.03.11, 05:54

                Member

                **

                Рейтинг (т): 8

                Цитата sansans @ 15.03.11, 05:21

                Достаточно в один из модулей добавить ниже приведенные строчки и все будет в порядке — не потребуется лазать в региональные настройки, ни переделывать код:

                ExpandedWrap disabled

                        …

                        initialization

                          DecimalSeparator := ‘.’;

                          DateSeparator := ‘.’; //на всякий случай

                        end.

                DecimalSeparator и пр. глобальные переменные. Через них можно заменять региональные значения на время работы программы.

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


                sansans



                Сообщ.
                #7

                ,
                15.03.11, 06:53

                  Позвольте осведомиться, уважаемый joiner, в чем же крамола этого метода решения проблемы?
                  А то только эмоции, без аргументов.
                  В справке Delphi нет ни гу-гу про то что нельзя «вмешиваться в эти настройки». Кстати, никакая это не настройка; при запуске любой дельфийской программы значения этих переменных берутся из региональных настроек и никаким образом не заменяют их в винде.
                  Да и при многолетней практике такого вмешательства не было замечено никаких отклонений от нормальной роботы программ.
                  И, потом, я не призываю применять изменение значений глобальных переменных вместо нормального программирования. Это лишь способ избежать непомерных трудозатрат в некоторых ситуациях (если заметили, конечно).

                  Сообщение отредактировано: sansans — 15.03.11, 06:58

                  Wizard

                  Bas



                  Сообщ.
                  #8

                  ,
                  15.03.11, 07:25

                    Цитата joiner @ 15.03.11, 05:54

                    нечего вмешиваться в эти настройки

                    Это локальные настройки программы.


                    joiner



                    Сообщ.
                    #9

                    ,
                    15.03.11, 07:25

                      Member

                      **

                      Рейтинг (т): 8

                      Цитата sansans @ 15.03.11, 06:53

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

                      Дело в том что когда пользователь у себя на компе выбирает те или иные региональные настройки он рассчитывает на то что все программы будут использовать именно их а не устанавливать разделители и форматы на свой лад.


                      sansans



                      Сообщ.
                      #10

                      ,
                      15.03.11, 08:14

                        Здесь я с вами резко соглашусь.
                        Но ведь и речь то шла именно о том, чтобы выбранные пользователем региональные настройки никоим образом не менялись. И вышеописанный прием как раз это и позволяет делать разработчику, который пишет приложения на Delphi с использованием SQL СУБД.
                        Скорее всего, вы не поняли, что изменения значений глобальных переменных в Delphi никак не затрагивает региональные настройки в винде и наш пользователь как имел их в первоначальном виде, так и имеет.
                        Для всех своих программ. А при конвертировании числа в строку «срабатывают» измененные гл. переменные.
                        Т.е. плохого мы ничего не делаем и «больно бить по рукам» за то что в Delphi много чего предусмотрено, а программеры это использует, думаю, не стоит.


                        Fr0sT



                        Сообщ.
                        #11

                        ,
                        15.03.11, 08:59

                          sansans, направление достаточно верное, но не совсем. Описанные тобой переменные повлияют на ВСЮ программу в целом. То есть, из-за внутренностей SQL, к примеру, бухгалтеры столкнутся с невозможностью копипейста прога <-> эксель/1с/калькулятор. Это не айс совершенно. А решение — в замечательных перегруженных функциях Format, FormatDateTime, … с параметром типа TFormatSettings. Туда можно подсунуть любое нужное значение региональных настроек без влияния на остальные части программы.

                          Добавлено 15.03.11, 09:01
                          К сожалению, с обратными функциями StrTo*** такого блага не предусмотрено :(


                          sansans



                          Сообщ.
                          #12

                          ,
                          15.03.11, 09:37

                            Согласен, «копипейста» прямого не получится (и то, правда, не всегда; к тому же не везде и требуется). Но это не самое страшное зло — на самом деле мало кто пользуется прямым (ручным) «копипейстом». А в программе этот пресловутый «копипейст» можно исправить как нужно.
                            Но, надо заметить, я привел прием, которые позволяет УЖЕ ГОТОВОЕ приложение исправить малой кровью.
                            И, наконец, полностью присоединяюсь к авторам постов, которые проповедуют делать все как надо с самого начала.

                            Wizard

                            Bas



                            Сообщ.
                            #13

                            ,
                            15.03.11, 09:41

                              Цитата Fr0sT @ 15.03.11, 08:59

                              бухгалтеры столкнутся с невозможностью копипейста прога <-> эксель

                              Если поле текстовое то столкнутся, если числовое то нет.


                              Fr0sT



                              Сообщ.
                              #14

                              ,
                              15.03.11, 13:35

                                sansans, ты привел прием, а я написал, как этот прием максимально изолировать во избежание самых разнообразных глюков.
                                Простой пример и без всякого копипаста.
                                1) Ставим DecimalSeparator = ‘.’
                                2) В Edit1 вводится некое float число. Разумеется, с региональным разделителем
                                3) f := FloatToStr(Edit1.Text) => БАМС! Эксепшен

                                Сообщение отредактировано: Fr0sT — 15.03.11, 13:35


                                sansans



                                Сообщ.
                                #15

                                ,
                                15.03.11, 15:51

                                  А этот «БАМС! Эксепшн» разве не будет, если в региональных настройках установлена точка, DecimalSeparator не применяем, а вводим число с запятой? Все будет точно так же.

                                  Приходится повторять, что проблема с региональными настройками будет всегда и разработчик, хочет он или не хочет, обязан её учитывать. Вот и все. А как он это будет делать с DecimalSeparator, через TFormatSettings, установкой у клиента виндовых настроек или, наконец, проверкой чего пользователь вводит в Edit — это его личное дело.

                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                  0 пользователей:

                                  • Предыдущая тема
                                  • Delphi: Базы данных
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0783 ]   [ 16 queries used ]   [ Generated: 10.02.23, 02:58 GMT ]  

                                  Понравилась статья? Поделить с друзьями:
                                • Spring response entity error
                                • Sql error code 3621
                                • Sql error 26 visual studio
                                • Sql error 1064 sqlstate 42000
                                • Spring param error