![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Type mismatch for field [D7]
Сергей Н. © (2005-07-29 13:35:00)Помогите, пожалуйста, решить такую проблему.
Есть две таблицы одинаковой структуры: Table1 и Table2. В Delphi есть SimpleDataSet1. У него в свойстве DataSet.CommandText лежит запрос ‘select * from Table1’.
По ходу программы я изменяю запрос на: ‘select * from Table1 union select * from Table2’ и получаю ошибку: “Type mismatch for field ‘CLID’, expecting: BCD actual: FMTBcdField”.
Сергей Н. (2005-07-29 17:20:00) [1]Спасибо. Действительно так!
Reindeer Moss Eater (2005-07-29 16:56:00) [2]Если параметры эти не поддерживаются, используй
TSQLQuery.NumericMapping:=True;
При этом в запросе без UNION все нумерик поля будут TFMTBCDField.
Как и в запросе с UNION.
Сергей Н. (2005-07-29 16:25:00) [3]Reindeer Moss Eater
С оракловским клиентом связываюсь через dbExpress. В компоненте SQLConnection таких параметров нет. :(
Fay
Я привык работать с DbExpress, думаю, что обойти эту проблему можно создав еще один датасет и потом переключаться с одного на другой. Но хочется решение покрасивее. :)
Нехорошее поле number(6)
Reindeer Moss Eater (2005-07-29 16:22:00) [4]У оракла нет такого физического типа.
Базовый NUMBER и все.
Поэтому на клиенте все экземпляры по хорошему должны быть ftFloat типа.
Но есть два параметра.
ENABLE INTEGERS и ENABLE BCD
Первый позволяет видеть на клиенте поля number(X,0) как целочисленные, а второй позволяет представлять number(m,n) как ftBCD.
Сделай оба параметра FALSE и получишь честные TFloatField.
Fay (2005-07-29 16:16:00) [5]2 Сергей Н. (29.07.05 16:10) [18]
1) DOA (или ODAC) не катит?
2) Какого типа это "нехорошее поле"? Мне не удалось добиться такого эффекта.
Сергей Н. (2005-07-29 16:10:00) [6]SQLDataSet + DataSetProvider + ClientDataSet : 3 в одном флаконе.
Reindeer Moss Eater (2005-07-29 15:56:00) [7]Это параметры используемые клиентом Оракла.
В BDE олни передаются через TDatabase.Params.
А в твоей библиотеке надо искать где. Что такое SimpleDataSet?
Сергей Н. (2005-07-29 15:52:00) [8]Anatoly Podgoretsky
Про звездочку - зарублю. :)
11 попробовал, результат тот же.
Удалить постоянные, предопределенные поля нельзя, т.к. в датасете есть Lookup и calcullated поля.
Эту ситуацию наблюдал и раньше с другими таблицами с той же ошибкой. Если запрос с union, то все поля TBCDField превращаются в TFMTBCDField. Даже создавал view с union и в датасет выбирал из него. Все равно Table3CLID: TFMTBCDField;
Reindeer Moss Eater
А можно немного подробнее. Где это задать? Это чьи свойства?
Reindeer Moss Eater (2005-07-29 15:41:00) [9]сделай
ENABLE INTEGERS=FALSE
ENABLE BCD=FALSE
и пересоздай экземпляры полей в датасете.
Anatoly Podgoretsky (2005-07-29 15:40:00) [10]Попробовать 11 и попробовать для начала удалить постоянные, предопределенные поля.
Кроме того зарубить себе на носу, никогда не использовать звездочку в реальных запросах
Сергей Н. (2005-07-29 15:38:00) [11]Reindeer Moss Eater
Plus сказал, что структуры идентичны.
Fay
При таком запросе тоже
Table3CLID: TFMTBCDField;
Anatoly Podgoretsky
Нет, полей хватает, но ругается только на числовые Integer
Anatoly Podgoretsky (2005-07-29 15:32:00) [12]Сергей Н. (29.07.05 14:56) [9]
И у тебя эти две первые таблицы из одного поля?
Fay (2005-07-29 15:05:00) [13]2 Сергей Н. (29.07.05 14:56) [9]
А если
select * from Table1
union
select * from Table1
?
Reindeer Moss Eater (2005-07-29 15:01:00) [14]desc table1;
и
desc table2;
в плюсе скажут всю правду об идентичности структур.
PS можно попробовать отключить enable integers и enable BCD если это позволяет библиотека доступа.
Сергей Н. (2005-07-29 14:56:00) [15]Две таблицы идентичны. Вторая создавалась как 'create table2 as select * from table1'.
В проекте создаю три датасета. В первый вставляю запрос: ‘select * from Table1’, во второй: ‘select * from Table2’, а в третий: ‘select * from Table1 union select * from Table2’. Далее смотрю описание класса:
type
TDM = class(TDataModule)
...
Table1: TSimpleDataSet;
Table1CLID: TBCDField;
...
Table2: TSimpleDataSet;
Table2CLID: TBCDField;
...
Table3: TSimpleDataSet;
Table3CLID: TFMTBCDField;
Fay (2005-07-29 14:28:00) [16]В любом случае, '*' лучше заменить перечислением полей.
Anatoly Podgoretsky (2005-07-29 14:26:00) [17]Sergey13 © (29.07.05 14:09) [5]
Ну это количество полей одинаковое :-)
Reindeer Moss Eater (2005-07-29 14:09:00) [18]Обойти ситуацию с разными типами можно.
Сделать типы одинаковыми.
Sergey13 (2005-07-29 14:09:00) [19]2[4] Сергей Н. (29.07.05 14:07)
>Запросы как есть. А что типы разные я вижу. Можно ли как-то обойти эту ситуацию?
Привести к одному типу.
Какая же у тебя одинаковая структура таблиц?
Сергей Н. (2005-07-29 14:07:00) [20]Запросы как есть. А что типы разные я вижу. Можно ли как-то обойти эту ситуацию?