Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Базы данных и репортинг > TADOQuery - не получаеться выполнить запрос |
Автор: KgCoder 11.9.2010, 15:29 | ||
Пишет: ADOQueryDB: Cannot perform this operation on a closed dataset. Подскажите ошибку... ![]() |
Автор: KgCoder 11.9.2010, 17:01 | ||
Нашел это: http://www.delphisources.ru/forum/showpost.php?p=38111&postcount=13 Сделал так:
Теперь она выводит ошибку "Access violation"... |
Автор: БелАмор 11.9.2010, 20:22 | ||||
По поводу первого варианта Вы добавляете строку к тому, что уже было в свойстве 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 |
Автор: Данкинг 12.9.2010, 01:04 | ||
|
Автор: cat512 12.9.2010, 17:06 | ||||
Может проблема в запросе? Что там за звёздочка такая? |
Автор: Данкинг 12.9.2010, 18:11 |
Вообще действительно: зачем звёздочка в delete? Хотя из-за этого должны быть глюки запроса, а не "closed dataset". |
Автор: БелАмор 12.9.2010, 20:31 | ||||
Это не так. Вот здесь вы заполняете SQL:
Кстати, здесь try-finally используется не по делу: вы пытаетесь работать с данными в любом случае, даже если при выполнении запрроса произошло исключение...
Тогда не знаю... |
Автор: KgCoder 12.9.2010, 22:14 | ||
Проблему решил!!! ![]() Проблема заключалось в... не знаю в чём. В общем вот код процедур загрузки/создания/редактирования/удаления:
То есть теперь ADOConnection создаётся при FormCreate, а ADOQuery отдельно для каждого действия. Теперь ругайте... может нагрузка больщая? Или чего не правильно? ![]() |
Автор: БелАмор 13.9.2010, 22:42 | ||
Вполне нормальный подход. Ничего особо плохого в нём нет. Даже есть плюсы, в частности, привычка писать программу кодом... Хотел бы только обратить внимание несколько моментов: 1. После открытия датасета (который до этого был в закрытом состоянии) текущей записью всегда становится первая, поэтому вызывать First в этом случае излишне. 2. Вообще, сложные строки удобно формировать с помощью функции Format. Это гораздо нагляднее, чем куча плюсов с апострофами, вызовами IntToStr и подобного. Я имею в виду действительно сложные строки, в данном случае это не очень актуально. 3. Данные, текстовое представление которых зависит от региональных настроек (например, дата), передавайте в запрос только через параметры. В данном случае таких данных не наблюдается, но наблюдается стремление писать весь запрос текстом... 4. Таки уберите уж звёздочку между DELETE и FROM... |
Автор: Deniz 14.9.2010, 05:23 |
Ну если уж сам просишь, извольте. Первым делом посмотри как работает блок try finally end. Далее, про Open + First уже сказали, First не нужен. Все тексты запросов к БД лучше оформлять с параметрами. Зачем в каждой процедуре создавать и удалять ADOQuery? Можно одну кинуть на форму и с ней работать. |