Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Type mismatch for field [D7]


Страницы:   1 2

Сергей Н. ©   (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]

Запросы как есть. А что типы разные я вижу. Можно ли как-то обойти эту ситуацию?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо