Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Type mismatch for field , expecting: Integer actual: BCD 
V
    Опции темы
Gunslinger
Дата 15.3.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Есть 3 формы: 
1. основная (на ней ADOConnection, подключенный к базе); 
2. форма Категория (дбгрид со всеми записями из Kategory), KatQuery (select * from Kategory;), KatDataSource. По Alt+F11 подключил Unit1, чтобы подключить квери к Form1->ADO.
3. форма Добавление Категории. Через Alt+F11 добавил форму1(для доступа к ADO) и форму2 (для доступа к KatDataSource). 

Нужно: при добавлении новой категории (форма3) в дбгриде(форма2) добавлялась эта запись.
для этого и подключил форму2 (Категория), чтобы написать KatQuery->Requery(); Но тут другая ошибка полезла.

Появление ошибки:
на форме Категория выставляю в свойстве KatQuery Active=true. Появляется ошибка: KatQuery:Type mismatch for field 'MoneyForHour', expecting: Integer actual: BCD'
Може кто знает, что за тип ошибки?

ps. Таблица Kategory: id - Счетчик, Title - Текстовый, MoneyForHour - Денежный, Descr - Memo. 
Код: 
Код

AddKatQuery->SQL->Add("insert into Kategory(Title, MoneyForHour,Descr) values(:Title, :MoneyForHour, :Descr)");
  AddKatQuery->Parameters->ParamByName("Title")->Value=KatTitle->Text;
  ddKatQuery->Parameters->ParamByName("MoneyForHour")->Value=StrToCurr(KatMoney->Text);
  AddKatQuery->Parameters->ParamByName("Descr")->Value=KatDescr->Text;
  AddKatQuery->ExecSQL();



Это сообщение отредактировал(а) Gunslinger - 15.3.2009, 15:02
PM MAIL   Вверх
Anikmar
Дата 15.3.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Что-то я не понял: запрос вроде как динамически формируется, а где вы выставляете active=true? Если в дезайн-режиме, то тогда что там у вас за запрос и какие поля созданы из дезайна?
PM MAIL ICQ   Вверх
mrbrooks
Дата 16.3.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Gunslinger, камрад, хорошим тоном  является вынесение всех невизуальных элементов для работы с БД в DateModule.
PM MAIL   Вверх
Gunslinger
Дата 16.3.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(Anikmar @  15.3.2009,  20:59 Найти цитируемый пост)
Что-то я не понял: запрос вроде как динамически формируется, а где вы выставляете active=true? Если в дезайн-режиме, то тогда что там у вас за запрос и какие поля созданы из дезайна? 


в дизайн-режиме выставлено только Active=true. Все остальное - в коде, который я привел. Active это тоже самое, что Open()? 


Цитата(mrbrooks @  16.3.2009,  09:12 Найти цитируемый пост)
Gunslinger, камрад, хорошим тоном  является вынесение всех невизуальных элементов для работы с БД в DateModule.

понял.
PM MAIL   Вверх
Anikmar
Дата 16.3.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Gunslinger @  15.3.2009,  14:57 Найти цитируемый пост)
на форме Категория выставляю в свойстве KatQuery Active=true. Появляется ошибка: KatQuery:Type mismatch for field 'MoneyForHour', expecting: Integer actual: BCD'


Если запрос формируется динамически, что вы открываете в дезайн-режиме?

Цитата(Gunslinger @  16.3.2009,  10:21 Найти цитируемый пост)
 Active это тоже самое, что Open()? 


Да.
PM MAIL ICQ   Вверх
Gunslinger
Дата 16.3.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(Anikmar @  16.3.2009,  10:37 Найти цитируемый пост)
Если запрос формируется динамически, что вы открываете в дезайн-режиме?

понятно. отстать от Active, код:
Код

AddKatQuery->Open();
AddKatQuery->SQL->Add("insert into Kategory(Title, MoneyForHour,Descr) values(:Title, :MoneyForHour, :Descr)");
  AddKatQuery->Parameters->ParamByName("Title")->Value=KatTitle->Text;
  ddKatQuery->Parameters->ParamByName("MoneyForHour")->Value=StrToCurr(KatMoney->Text);
  AddKatQuery->Parameters->ParamByName("Descr")->Value=KatDescr->Text;
 AddKatQuery->ExecSQL();

Т.е. механизм, как я его представляю: квери подключается к ADO. Сначала открываем квери - он подключается к адо, затем формируем sql-код и отправляем - отправка ExecSQL(). Стопудов, я как всегда ошибаюсьsmile
PM MAIL   Вверх
mrbrooks
Дата 16.3.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Gunslinger @  16.3.2009,  11:16 Найти цитируемый пост)
Стопудов, я как всегда ошибаюсь

Есть такое.  smile 

Код

AddKatQuery->Close();
AddKatQuery->SQL->Clear();
AddKatQuery->SQL->Add("insert into Kategory(Title, MoneyForHour,Descr) values(:Title, :MoneyForHour, :Descr)");
AddKatQuery->Parameters->ParamByName("Title")->Value=KatTitle->Text;
AddKatQuery->Parameters->ParamByName("MoneyForHour")->Value=StrToCurr(KatMoney->Text);
AddKatQuery->Parameters->ParamByName("Descr")->Value=KatDescr->Text;
AddKatQuery->ExecSQL();
AddKatQuery->SQL->Clear();
AddKatQuery->SQL->Add("SELECT * FROM Kategory");
AddKatQuery->Open();

PM MAIL   Вверх
Anikmar
Дата 16.3.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Если использовать параметры, зачем динамически запрос создавать? Ну и запихать его в режиме дизайна, а затем через параметры уже программно управлять им.
PM MAIL ICQ   Вверх
Gunslinger
Дата 16.3.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(mrbrooks @  16.3.2009,  11:27 Найти цитируемый пост)

Код

AddKatQuery->Close();
AddKatQuery->SQL->Clear();
AddKatQuery->SQL->Add("insert into Kategory(Title, MoneyForHour,Descr) values(:Title, :MoneyForHour, :Descr)");
AddKatQuery->Parameters->ParamByName("Title")->Value=KatTitle->Text;
AddKatQuery->Parameters->ParamByName("MoneyForHour")->Value=StrToCurr(KatMoney->Text);
AddKatQuery->Parameters->ParamByName("Descr")->Value=KatDescr->Text;
AddKatQuery->ExecSQL();
AddKatQuery->SQL->Clear();
AddKatQuery->SQL->Add("SELECT * FROM Kategory");
AddKatQuery->Open();

В закрытый квери написали запрос, затем выполнили, затем очистили запрос и написали новый, затем только отркыли квери.... 
Не въехал в логику механизма.
1. Что делает ExecSQL()?
2. Что делает Open()? Знаю, что открывает соединение с ADO. А предварительно написанный sql автоматически отсылает?
3. Второй запрос (select). Одним квери можно воспользоваться для нескольких запросов? Один квери!=один запрос, никаких подводных камней?

Цитата(Anikmar @  16.3.2009,  11:32 Найти цитируемый пост)
Если использовать параметры, зачем динамически запрос создавать? Ну и запихать его в режиме дизайна, а затем через параметры уже программно управлять им. 

Т.е. запросы (select,insert,delete,update) прописать в проперть SQL в дизайнере, а в коде пользоваться через Parameters->ParamByName?


Это сообщение отредактировал(а) Gunslinger - 16.3.2009, 20:06
PM MAIL   Вверх
Anikmar
Дата 16.3.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Gunslinger @  16.3.2009,  20:04 Найти цитируемый пост)
1. Что делает ExecSQL()?
2. Что делает Open()? Знаю, что открывает соединение с ADO. А предварительно написанный sql автоматически отсылает?
3. Второй запрос (select). Одним квери можно воспользоваться для нескольких запросов? Один квери!=один запрос, никаких подводных камней?


Отличие Open от Exec - только в сути команды SQL. Если команда возвращает набор данных - нужно использовать Open. Если команнда SQL возвращает только 1 значение как результат работы - то нужно использовать EXEC.

Можно просто придерживаться правилом: SELECT - Open, INSERT, UPDATE и т.п. - EXEC

По вопросу использования 1 запроса на все случаи жизни - много вы не сэкономите, а вот запутаться можно. Я не использую без особой нужды перезапись SQL запроса в одном объекте, если они радикально отличаются по смыслу.

По поводу параметризированных запросов. Можно параметры создать в дезайн-режиме, а затем заполнять их программно. Можно всю строку SQL формировать динамически. Думаю однозначно что лучше сказать никто не сможет - все зависит от ситуации. Я предпочитаю пользоваться параметрами, но иногда и полностью формирую запрос.
PM MAIL ICQ   Вверх
dumb
Дата 17.3.2009, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



за все не скажу, но "большие и сильные" СУБД "кэшируют" запросы(составляют план доступа).
так вот: для запросов с параметрами эта технология успешно работает, в отличие от полностью сформированных в виде строки.
PM MAIL   Вверх
mrbrooks
Дата 17.3.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Gunslinger @  16.3.2009,  20:04 Найти цитируемый пост)
3. Второй запрос (select). Одним квери можно воспользоваться для нескольких запросов? Один квери!=один запрос, никаких подводных камней?

Разумеется. Использовать 100 Query для разных запросов - с моей точки зрения рачительно.

Цитата(Anikmar @  16.3.2009,  21:39 Найти цитируемый пост)
По вопросу использования 1 запроса на все случаи жизни - много вы не сэкономите, а вот запутаться можно. Я не использую без особой нужды перезапись SQL запроса в одном объекте, если они радикально отличаются по смыслу.

Не согласен - но тут на вкус и цвет - товарищей нет  smile 
PM MAIL   Вверх
Gunslinger
Дата 17.3.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: нет
Всего: 3



Цитата(Anikmar @  16.3.2009,  21:39 Найти цитируемый пост)
Отличие Open от Exec - только в сути команды SQL.

понял, спасибо!

mrbrooks, пока не постаил в начале Close(), Clear() - при втором добавлении лезла ошибка 'неправильно определен объект Parameter. Предоставлены несовместимые данные'. Без Close() ошибки тоже нет. Зачем предварительно закрывать квери? Если для того, чтобы очистить sql, то для второго sql (select)  ты написал только очистку без Close(). 
PM MAIL   Вверх
Anikmar
Дата 17.3.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



mrbrooks
Разумеется. Использовать 100 Query для разных запросов - с моей точки зрения рачительно.

Спорно и очень спорно.
При постоянной перестройке запрос увеличивается код.
При поддержании для каждого запроса своего Query увеличивается объем exe

Так что во истину - на вкус и на цвет.
Мой подход такой:
Объект в программе, который оторажает объект реального мира имеет в своем составе модуль данных, а в нем несколько TQuery для разных нужд этого объекта. Некоторые небольшия я перестраиваю динамически, но редко. Если мне такой объект не нужен - он у меня и не создается (как не создается модуль данных). Следовательно память не расходуется (кроме как на методы и на текстовые константы). Однако текстовые константы в таком случае существют в единственном экземпляре - для каждого TQuery.

В случае динамического создания при каждом формировании запроса используется текстовая константа. И если в разных частях программы нужно создать похожий или один и тот же запрос начинается выкручивание с функциями и т.п. либо на это все забивается и плодится еще одна константа.

Конечно можно загнать тексты запросов в ресурсы либо использовать внешние файлы.

В общем - дело вкуса, но я предпочитаю именно так.
PM MAIL ICQ   Вверх
mrbrooks
Дата 17.3.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Gunslinger @  17.3.2009,  09:58 Найти цитируемый пост)
пока не постаил в начале Close(), Clear() - при втором добавлении лезла ошибка 'неправильно определен объект Parameter. Предоставлены несовместимые данные'. Без Close() ошибки тоже нет.

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

Цитата(Gunslinger @  17.3.2009,  09:58 Найти цитируемый пост)
Зачем предварительно закрывать квери? Если для того, чтобы очистить sql, то для второго sql (select)  ты написал только очистку без Close().  

Close() ... Open() используется для формирования SQL запроса и обновления НД.

Добавлено через 3 минуты и 2 секунды
Цитата(Anikmar @  17.3.2009,  12:28 Найти цитируемый пост)
Спорно и очень спорно.
При постоянной перестройке запрос увеличивается код.
При поддержании для каждого запроса своего Query увеличивается объем exe

Я использую виртуальный список. Мне нравится.  smile 

Цитата(Anikmar @  17.3.2009,  12:28 Найти цитируемый пост)
Мой подход такой:
Объект в программе, который оторажает объект реального мира имеет в своем составе модуль данных, а в нем несколько TQuery для разных нужд этого объекта. Некоторые небольшия я перестраиваю динамически, но редко. Если мне такой объект не нужен - он у меня и не создается (как не создается модуль данных). Следовательно память не расходуется (кроме как на методы и на текстовые константы). Однако текстовые константы в таком случае существют в единственном экземпляре - для каждого TQuery.

в целом я поступаю также - только обхожусь одним TQuery. Мне нравится.  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.