![]() |
|
|
![]()
|
|
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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. Код:
Это сообщение отредактировал(а) Gunslinger - 15.3.2009, 15:02 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Что-то я не понял: запрос вроде как динамически формируется, а где вы выставляете active=true? Если в дезайн-режиме, то тогда что там у вас за запрос и какие поля созданы из дезайна?
|
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
Gunslinger, камрад, хорошим тоном является вынесение всех невизуальных элементов для работы с БД в DateModule.
|
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: нет Всего: 3 |
в дизайн-режиме выставлено только Active=true. Все остальное - в коде, который я привел. Active это тоже самое, что Open()?
понял. |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: нет Всего: 3 |
понятно. отстать от Active, код:
Т.е. механизм, как я его представляю: квери подключается к ADO. Сначала открываем квери - он подключается к адо, затем формируем sql-код и отправляем - отправка ExecSQL(). Стопудов, я как всегда ошибаюсь |
||||
|
|||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
Есть такое.
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Если использовать параметры, зачем динамически запрос создавать? Ну и запихать его в режиме дизайна, а затем через параметры уже программно управлять им.
|
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: нет Всего: 3 |
В закрытый квери написали запрос, затем выполнили, затем очистили запрос и написали новый, затем только отркыли квери.... Не въехал в логику механизма. 1. Что делает ExecSQL()? 2. Что делает Open()? Знаю, что открывает соединение с ADO. А предварительно написанный sql автоматически отсылает? 3. Второй запрос (select). Одним квери можно воспользоваться для нескольких запросов? Один квери!=один запрос, никаких подводных камней?
Т.е. запросы (select,insert,delete,update) прописать в проперть SQL в дизайнере, а в коде пользоваться через Parameters->ParamByName? Это сообщение отредактировал(а) Gunslinger - 16.3.2009, 20:06 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Отличие Open от Exec - только в сути команды SQL. Если команда возвращает набор данных - нужно использовать Open. Если команнда SQL возвращает только 1 значение как результат работы - то нужно использовать EXEC. Можно просто придерживаться правилом: SELECT - Open, INSERT, UPDATE и т.п. - EXEC По вопросу использования 1 запроса на все случаи жизни - много вы не сэкономите, а вот запутаться можно. Я не использую без особой нужды перезапись SQL запроса в одном объекте, если они радикально отличаются по смыслу. По поводу параметризированных запросов. Можно параметры создать в дезайн-режиме, а затем заполнять их программно. Можно всю строку SQL формировать динамически. Думаю однозначно что лучше сказать никто не сможет - все зависит от ситуации. Я предпочитаю пользоваться параметрами, но иногда и полностью формирую запрос. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
за все не скажу, но "большие и сильные" СУБД "кэшируют" запросы(составляют план доступа).
так вот: для запросов с параметрами эта технология успешно работает, в отличие от полностью сформированных в виде строки. |
|||
|
||||
| mrbrooks |
|
||||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
Разумеется. Использовать 100 Query для разных запросов - с моей точки зрения рачительно.
Не согласен - но тут на вкус и цвет - товарищей нет |
||||
|
|||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: нет Всего: 3 |
понял, спасибо! mrbrooks, пока не постаил в начале Close(), Clear() - при втором добавлении лезла ошибка 'неправильно определен объект Parameter. Предоставлены несовместимые данные'. Без Close() ошибки тоже нет. Зачем предварительно закрывать квери? Если для того, чтобы очистить sql, то для второго sql (select) ты написал только очистку без Close(). |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
mrbrooks
Разумеется. Использовать 100 Query для разных запросов - с моей точки зрения рачительно. Спорно и очень спорно. При постоянной перестройке запрос увеличивается код. При поддержании для каждого запроса своего Query увеличивается объем exe Так что во истину - на вкус и на цвет. Мой подход такой: Объект в программе, который оторажает объект реального мира имеет в своем составе модуль данных, а в нем несколько TQuery для разных нужд этого объекта. Некоторые небольшия я перестраиваю динамически, но редко. Если мне такой объект не нужен - он у меня и не создается (как не создается модуль данных). Следовательно память не расходуется (кроме как на методы и на текстовые константы). Однако текстовые константы в таком случае существют в единственном экземпляре - для каждого TQuery. В случае динамического создания при каждом формировании запроса используется текстовая константа. И если в разных частях программы нужно создать похожий или один и тот же запрос начинается выкручивание с функциями и т.п. либо на это все забивается и плодится еще одна константа. Конечно можно загнать тексты запросов в ресурсы либо использовать внешние файлы. В общем - дело вкуса, но я предпочитаю именно так. |
|||
|
||||
| mrbrooks |
|
||||||||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
возможно. писал здесь. обычно я параметры не использую, предпочитая формировать запрос строкой.
Close() ... Open() используется для формирования SQL запроса и обновления НД. Добавлено через 3 минуты и 2 секунды
Я использую виртуальный список. Мне нравится.
в целом я поступаю также - только обхожусь одним TQuery. Мне нравится. |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |