Содержание
- Sql error code 804 incorrect values within sqlda structure
- exception when using a boolean parameter with an embedded v2.5 server [DNET683] #636
- Comments
- Error executing a query with a column of length 0 working against the embedded server [DNET60] #71
- Comments
- Footer
- 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 (с БД), TIBTransaction (с TIBDatabase, хотя зачем это, не знаю :-)), 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. Будут какие-нибудь соображения на этот счет?
Источник
I’m getting this dynamic sql warning after trying to fetch results from this query:
Warning: ibase_fetch_assoc(): Dynamic SQL Error SQL error code = -804 Incorrect values within SQLDA structure
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;
And this php code:
$p_sql = ibase_prepare($sql);
$rs = ibase_execute($p_sql);
while($row = ibase_fetch_assoc($rs)){
$auto = new auto($row);
$this->list[] = $auto;
}
How come there are incorrect values? And how do you solve this problem?
asked Sep 12, 2015 at 14:38
3
You can always try to run the sql direct on the database.
Because the Sql query looks ok, I can only think maybe there is a typo in a field name or doesn’t return rows. Or the where fields aren’t numeric
Also may I suggest use alias instead of full table name, that help to read the query.
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;
answered Sep 12, 2015 at 14:50
0
Don’t know if you solved it already, but i had the same error with a simple query like:
SELECT * FROM "any_Table" WHERE "id"=1
It worked for me after i replace the * with the column name:
SELECT "id", "Name" FROM "any_table" WHERE "id"=1
I think it has something to do with the interbase driver, i found this:
Bug report
It appears that the php interbase client can’t handle boolean fields, after i had changed the boolean field in a integer the select * works.
I’m using XAMPP, PHP Version 5.6.15, with interbase XE7 on windows and used gds32.dll from the interbase install (12.0.4.357).
answered Feb 8, 2016 at 10:51
mewikimewiki
1354 bronze badges
Модераторы: 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? Или это имеется в виду работа через THread?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 21 дек 2004, 09:54
getman, не суетись. кто тебя вообще заставляет на каждый IBQuery пихать IBTransaction, пусть даже и при работе с thread???
|
|
|
SQL error 804
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Junior Рейтинг (т): 1 |
Доброго времени суток! |
AlexFSM |
|
Junior Рейтинг (т): 1 |
И так, после мозгового штурма проблема решилась, ошибка «SQL Error cod -804 Count of read-write columns does not equal count of values» была ликвидирована путем смены РЕГИОНАЛЬНЫХ НАСТРОЕК (разделитель целой и дробной части) вместо «,» надо было поставить «.» |
Игорь Акопян |
|
[телепатический локатор включен] Добавлено 29.01.09, 07:24 |
AlexFSM |
|
Junior Рейтинг (т): 1 |
Цитата Игорь Акопян @ 29.01.09, 07:23 параметры использовать!
Да? Надо попробовать. |
sansans |
|
Дело, конечно, прошлое, но как показывают наблюдения, многие и сейчас, особенно начинающие, натыкаются на грабли «РЕГИОНАЛЬНЫХ НАСТРОЕК» и, как следствие: «Count of read-write columns does not equal count of values». А есть простой выход. … initialization DecimalSeparator := ‘.’; DateSeparator := ‘.’; //на всякий случай end. DecimalSeparator и пр. глобальные переменные. Через них можно заменять региональные значения на время работы программы. Новичкам, работающим с SQL, надо пояснить, что в Delphi разделитель целой и дробной части чисел всегда является точка. Текст запроса — это строка, следовательно, при «ручной сборке» запроса числа необходимо преобразовывать в строковое представление. Этим в Delphi занимаются несколько функций. Сообщение отредактировано: sansans — 15.03.11, 05:39 |
joiner |
|
Member Рейтинг (т): 8 |
Цитата sansans @ 15.03.11, 05:21 Достаточно в один из модулей добавить ниже приведенные строчки и все будет в порядке — не потребуется лазать в региональные настройки, ни переделывать код: … initialization DecimalSeparator := ‘.’; DateSeparator := ‘.’; //на всякий случай end. DecimalSeparator и пр. глобальные переменные. Через них можно заменять региональные значения на время работы программы. За такое надо бить больно по руках ибо нечего вмешиваться в эти настройки. Надо сразу писать нормально чтобы потом получалось подобных ситуаций, а если уж такое случилось то ни в коем случае не применять этот метод решения. |
sansans |
|
Позвольте осведомиться, уважаемый joiner, в чем же крамола этого метода решения проблемы? Сообщение отредактировано: sansans — 15.03.11, 06:58 |
Bas |
|
Цитата joiner @ 15.03.11, 05:54 нечего вмешиваться в эти настройки Это локальные настройки программы. |
joiner |
|
Member Рейтинг (т): 8 |
Цитата sansans @ 15.03.11, 06:53 Позвольте осведомиться, уважаемый joiner, в чем же крамола этого метода решения проблемы? Дело в том что когда пользователь у себя на компе выбирает те или иные региональные настройки он рассчитывает на то что все программы будут использовать именно их а не устанавливать разделители и форматы на свой лад. |
sansans |
|
Здесь я с вами резко соглашусь. |
Fr0sT |
|
sansans, направление достаточно верное, но не совсем. Описанные тобой переменные повлияют на ВСЮ программу в целом. То есть, из-за внутренностей SQL, к примеру, бухгалтеры столкнутся с невозможностью копипейста прога <-> эксель/1с/калькулятор. Это не айс совершенно. А решение — в замечательных перегруженных функциях Format, FormatDateTime, … с параметром типа TFormatSettings. Туда можно подсунуть любое нужное значение региональных настроек без влияния на остальные части программы. Добавлено 15.03.11, 09:01 |
sansans |
|
Согласен, «копипейста» прямого не получится (и то, правда, не всегда; к тому же не везде и требуется). Но это не самое страшное зло — на самом деле мало кто пользуется прямым (ручным) «копипейстом». А в программе этот пресловутый «копипейст» можно исправить как нужно. |
Bas |
|
Цитата Fr0sT @ 15.03.11, 08:59 бухгалтеры столкнутся с невозможностью копипейста прога <-> эксель Если поле текстовое то столкнутся, если числовое то нет. |
Fr0sT |
|
sansans, ты привел прием, а я написал, как этот прием максимально изолировать во избежание самых разнообразных глюков. Сообщение отредактировано: Fr0sT — 15.03.11, 13:35 |
sansans |
|
А этот «БАМС! Эксепшн» разве не будет, если в региональных настройках установлена точка, DecimalSeparator не применяем, а вводим число с запятой? Все будет точно так же. Приходится повторять, что проблема с региональными настройками будет всегда и разработчик, хочет он или не хочет, обязан её учитывать. Вот и все. А как он это будет делать с DecimalSeparator, через TFormatSettings, установкой у клиента виндовых настроек или, наконец, проверкой чего пользователь вводит в Edit — это его личное дело. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Базы данных
- Следующая тема
[ Script execution time: 0,0465 ] [ 16 queries used ] [ Generated: 9.02.23, 10:34 GMT ]
Author: Craig Stuntz
The error in the title comes from InterBase. Actually, the full error is:
[DataDirect][ODBC InterBase driver][InterBase]Dynamic SQL Error, SQL error code = -804, SQLDA missing or incorrect version, or incorrect number/type of variables.
I’ve seen this error before when the wrong InterBase client (gds32.dll) version was loaded by the application, or when the wrong number of variables is passed to a stored procedure. But yesterday I found a new way to get the error. It took me quite a while to debug this, so I’m putting the information out in case other people encounter it.
It seems that certain versions of InterBase server don’t respond well to passing a parameter of type ShortInt to a parameterized query that calls a stored procedure with that param as an integer argument. In particular, I found that doing this will fail on InterBase server version 7.5.1.162, but works fine on 7.5.1.80. Changing the type of the parameter to integer fixes the problem. I was doing this via ODBC; I don’t know if it makes a difference or not.
(Why was I using a parameter of type ShortInt in the first place? I wasn’t, exactly. But the value that I assigned to the Param.Value, a variant, was the constant 0. Delphi will treat the constant value 0 as a ShortInt.)
This is a good example of why unit testing can never be sufficient to completely test an application. Since this is a server error, a unit test can’t find it. Since it only happens on certain versions of the server, even basic integration testing might miss it. The only way to have a hope of finding such an error is to do automated testing on multiple environments. In this case, the error prevented a Crystal report from executing at all. We have a testing tool built into our applications that executes all of the reports and saves timing information to a log file. We run this with every QA releasewe do, and compare the timing information with previous releases. Sometimes we catch reports which won’t executed all, as with this case. In other cases, we find that the report has become much faster or much slower, due to a database metadata change.
The report profiler is part of a “debug console” which is built into the applications and provides testing and diagnostic information at runtime. I said before that testing is a valid use case, and this is one example. Another, report-related example is that whenever our applications modified the SQL in a report (to customize the result set for an end user), we have a way to display the final SQL before it is executed by the report. The reason is that a particular customer might make a particular selection that either performs badly or does not execute at all. (End users don’t directly edit SQL; instead they choose the data they want to see graphically, and we build SQL from their choices.) In order to reproduce their problem in a debug environment we need to know precisely what kind of choices they have made, and how the software handle those choices. Displaying the SQL before it is executed answer six questions.
Я получаю это динамическое предупреждение 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
Amilly 0 / 0 / 0 Регистрация: 03.12.2010 Сообщений: 4 |
||||
1 |
||||
20.12.2012, 20:46. Показов 4127. Ответов 1 Метки нет (Все метки)
Всем доброго вечера! Помогите пожалуйста, такая проблема.Создаю базу в IBExpert. При создании хранимой процедуры на добавлении записи в таблицы выходит такая ошибка An error was found in the application program input parameters for the SQL statement. Код на добавление записи в таблицу:
__________________
0 |
912 / 877 / 62 Регистрация: 06.01.2010 Сообщений: 2,367 Записей в блоге: 6 |
|
20.12.2012, 21:16 |
2 |
Вы пересеклись с другой, паралельной транзакцией. p.s. делать suspend при отсутствии выходных параметров бессмыслено.
1 |