![]() |
|
![]() ![]() ![]() |
|
KgCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 6.3.2008 Где: KGstan Репутация: нет Всего: нет |
Пишет: ADOQueryDB: Cannot perform this operation on a closed dataset. Подскажите ошибку... ![]() Это сообщение отредактировал(а) KgCoder - 12.9.2010, 23:04 |
|||
|
||||
KgCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 6.3.2008 Где: KGstan Репутация: нет Всего: нет |
Нашел это: ADO Проблемы
Сделал так:
Теперь она выводит ошибку "Access violation"... |
|||
|
||||
БелАмор |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: нет Всего: 17 |
По поводу первого варианта
Вы добавляете строку к тому, что уже было в свойстве SQL. И что получается? Либо перед добавлением очищайте свойство SQL, либо присвавайте напрямую SQL.Text Свойство SQL имеет тип TStrings. Почитайте о TStrings, он используется практически везде. По поводу второго варианта 1. "Active := false" и "Close" - это одно и то-же. 2. "DataSource.Enabled := false" а) А у вас вообще назначено свойство ADOQueryDB.DataSource ? б) Если назначено, то зачем? 3.
Если в ADOQueryDB могут выполняться разные запросы, то формируйте их все каждый раз заново, не интересуясь, что там было в свойстве SQL раньше, а не занимайтесь сохранением/восстановлением чего-то, забитого в дизайн-тайм. 4.
Active:=True или Open используются для запросов, возвращающих данные, т.е. для запросов с SELECT |
||||
|
|||||
KgCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 6.3.2008 Где: KGstan Репутация: нет Всего: нет |
ADOQuery чист. Тем не менее, ошибка выходит и через SQL.Text и через SQL.Clear; SQL.Add; Всё это я знаю, и всё это взято из примера указанного по ссылке и не изменено, чтобы подчеркнуть тот, что проблему там решили, а в моём случае, она не решается. Ориентируйтесь на первый пост. Там нету ничего лишнего и при этом она провоцирует ошибку. Прикрепляю файл проекта. (Используются ADO, PNGComponents и VirtualTree). Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
-------------------- There's nothing left but silent epitaphs. |
|||
|
||||
cat512 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Может проблема в запросе? Что там за звёздочка такая? |
||||
|
|||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
Вообще действительно: зачем звёздочка в delete? Хотя из-за этого должны быть глюки запроса, а не "closed dataset". -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
БелАмор |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: нет Всего: 17 |
Это не так. Вот здесь вы заполняете SQL:
Кстати, здесь try-finally используется не по делу: вы пытаетесь работать с данными в любом случае, даже если при выполнении запрроса произошло исключение...
Тогда не знаю... |
||||
|
|||||
KgCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 6.3.2008 Где: KGstan Репутация: нет Всего: нет |
Проблему решил!!!
![]() Проблема заключалось в... не знаю в чём. В общем вот код процедур загрузки/создания/редактирования/удаления:
То есть теперь ADOConnection создаётся при FormCreate, а ADOQuery отдельно для каждого действия. Теперь ругайте... может нагрузка больщая? Или чего не правильно? ![]() |
|||
|
||||
БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: нет Всего: 17 |
Вполне нормальный подход. Ничего особо плохого в нём нет. Даже есть плюсы, в частности, привычка писать программу кодом... Хотел бы только обратить внимание несколько моментов: 1. После открытия датасета (который до этого был в закрытом состоянии) текущей записью всегда становится первая, поэтому вызывать First в этом случае излишне. 2. Вообще, сложные строки удобно формировать с помощью функции Format. Это гораздо нагляднее, чем куча плюсов с апострофами, вызовами IntToStr и подобного. Я имею в виду действительно сложные строки, в данном случае это не очень актуально. 3. Данные, текстовое представление которых зависит от региональных настроек (например, дата), передавайте в запрос только через параметры. В данном случае таких данных не наблюдается, но наблюдается стремление писать весь запрос текстом... 4. Таки уберите уж звёздочку между DELETE и FROM... |
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Ну если уж сам просишь, извольте.
Первым делом посмотри как работает блок try finally end. Далее, про Open + First уже сказали, First не нужен. Все тексты запросов к БД лучше оформлять с параметрами. Зачем в каждой процедуре создавать и удалять ADOQuery? Можно одну кинуть на форму и с ней работать. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |