powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ADOQuery: проблема с Open(); и ExecSQL();
9 сообщений из 9, страница 1 из 1
ADOQuery: проблема с Open(); и ExecSQL();
    #33237903
Botik84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а у меня возникла проблема при работе с TADOQuery
нужно было выполнить команды вставки и удаления SQL
при этом я сначала пользовался методом Open() для выполнения запроса на что получил исключение Edatabaseerror
посмотрел в литературе что надо использовать ExecSQL();
но требуется чтобы запрос был выполнен вне зависимости от того SELECT или INSERT...
написал примерно следующее:
try
{TQuery->Clear();
TQuery->Add(SQLText);
TQuery->Open();
}
catch(EDatabaseError&)
{TQuery->ExecSQL();
}
но после ентого стал получать сообщение о том что запись уже вставлена.....получается исключение есть ...и запись вставлена методом
Open()..что это такое я не понял.....а тем более как с ентим бороться...
если можете помогите пожалуйста..
...
Рейтинг: 0 / 0
ADOQuery: проблема с Open(); и ExecSQL();
    #33237987
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Botik84а у меня возникла проблема при работе с TADOQuery
нужно было выполнить команды вставки и удаления SQL
при этом я сначала пользовался методом Open() для выполнения запроса на что получил исключение Edatabaseerror
посмотрел в литературе что надо использовать ExecSQL();
но требуется чтобы запрос был выполнен вне зависимости от того SELECT или INSERT...
написал примерно следующее:
try
{TQuery->Clear();
TQuery->Add(SQLText);
TQuery->Open();
}
catch(EDatabaseError&)
{TQuery->ExecSQL();
}
но после ентого стал получать сообщение о том что запись уже вставлена.....получается исключение есть ...и запись вставлена методом
Open()..что это такое я не понял.....а тем более как с ентим бороться...
если можете помогите пожалуйста..
Надо просто понять что и как делается...
Если использовать Open, то компонент TQuery будет пытаться создать результирующий рекордсет. Если дается на выполнение команда INSERT, то, естественно, рекордсет получается пустой и выдается ошибка (при этом сама команда выполнится!).
Если использовать ExecSQL, то компонент TQuery просто выполнит команду и, если это будет SELECT, результирующий рекордсет просто проигнорируется.
Самое лучшее решение в товем случае - написать небольшой парсер SQL выражений. Например:
- если в SQLText содержится слово "SELECT", то надо использовать TQuery->Open();
- Если в SQLText содержится любое другое ключевое слово, то надо использовать TQuery->ExecSQL();
Примерно так... Успехов!
...
Рейтинг: 0 / 0
ADOQuery: проблема с Open(); и ExecSQL();
    #33242178
Botik84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да такое решение мне приходило в голову....а как насчёт использования отката перед выполнением ExecSQL();/// такое вроде бы возможно ....
причём у меня два способа в голове...это
через команды TSQL
или с помощью функций ADOConnection///
спасибо за ответ....
...
Рейтинг: 0 / 0
ADOQuery: проблема с Open(); и ExecSQL();
    #33242181
Botik84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и кстати почему именно я выбрал такой код....так только потому что такое решение предлагается в книгах....наверно там предполагается что Open();
ничего не делает при ошибке ..... или просто что-то перепутанно....ещё раз спасибо
...
Рейтинг: 0 / 0
ADOQuery: проблема с Open(); и ExecSQL();
    #33244633
Botik84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за ответ:)
Я уже так сделал...вроде нормально
у меня просто было ещё одно решение сделать откат перед выполнением ExecSQL();
но похоже оно менее логично....ещё раз большое спасибо...
...
Рейтинг: 0 / 0
ADOQuery: проблема с Open(); и ExecSQL();
    #33244661
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для Карабас Барабас:
Помнится ты спрашивал, почему я никому не рекомендую использовать VCL для доступа к базам данных? Вот и еще один довод :)
Если бы Botik84 с самого начала работал с чистым ADO без прослойки VCL, то его проблемы не возникло бы вообще. В системе классов ADO это все уже давно предусмотрено и отлажено. Создаешь объект класса Command, задаешь ему параметр CommandText. Причем любую команду хоть select, хоть update, хоть вызов хранимой процедуры. Потом myRS = myCommand.Execute(...); и проверяешь получили резалт-сет или нет.
А все VCL-ные классы TADOQuery и ему подобная фигня только сбивает с толку и без нужды усложняет код.
...
Рейтинг: 0 / 0
ADOQuery: проблема с Open(); и ExecSQL();
    #33244703
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА все VCL-ные классы TADOQuery и ему подобная фигня только сбивает с толку и без нужды усложняет код.

как раз я бы сказал в VC перегружено через край - если не делать оберток, то текста раз в 5 больше.

В BBC если UPDATE & INSERT надо пользоваться ExecSQL а если SELECT то Open.
...
Рейтинг: 0 / 0
ADOQuery: проблема с Open(); и ExecSQL();
    #33244784
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА все VCL-ные классы TADOQuery и ему подобная фигня только сбивает с толку и без нужды усложняет код
Ну я бы не стал так сгоряча все хаять
Просто надо внимательно и правильно использовать библиотеки :)

Тут периодически в ИБ/ФБ появляются чудаки, которые кричат, мол у меня в МССКЛ так работает, а в ФБ - нет, вывод - ФБ гамно ! Им долго объясняют потом, что в ФБ надо по-другому делать тоже самое.

ПС: я не защищаю ВЦЛ, просто раз есть работоспособная библиотека, то надо просто правильно ее использовать, больших проблем не должно быть.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ADOQuery: проблема с Open(); и ExecSQL();
    #33256254
BasV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему не работает Query.Open(Query.ExecSQL)?
Что значит "ENoResultSet Error creating cursor handle"?

1.Query.Open возвращает результат запроса в виде курсора(Cursor).

Когда мы выполняем запрос «select * from table1» мы получаем
Набор данных (Cursor). Можете представит курсор как виртуальную таблицу, со строками и столбцами, определенными в запросе. В этом случае надо использовать Query.Open или Query.Active:=true;

2.Query.ExecSQL выполняет инструкции запроса и курсор не создается.

Если в запросах используются инструкции не создающие набор данных (курсор) – СREATE TABLE, INSERT, DELETE, UPDATE , SELECT INTO и т.д. то нужно вызывать метод ExecSQL.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ADOQuery: проблема с Open(); и ExecSQL();
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]