|
|
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
а у меня возникла проблема при работе с TADOQuery нужно было выполнить команды вставки и удаления SQL при этом я сначала пользовался методом Open() для выполнения запроса на что получил исключение Edatabaseerror посмотрел в литературе что надо использовать ExecSQL(); но требуется чтобы запрос был выполнен вне зависимости от того SELECT или INSERT... написал примерно следующее: try {TQuery->Clear(); TQuery->Add(SQLText); TQuery->Open(); } catch(EDatabaseError&) {TQuery->ExecSQL(); } но после ентого стал получать сообщение о том что запись уже вставлена.....получается исключение есть ...и запись вставлена методом Open()..что это такое я не понял.....а тем более как с ентим бороться... если можете помогите пожалуйста.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2005, 23:42 |
|
||
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
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(); Примерно так... Успехов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2005, 07:51 |
|
||
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
да такое решение мне приходило в голову....а как насчёт использования отката перед выполнением ExecSQL();/// такое вроде бы возможно .... причём у меня два способа в голове...это через команды TSQL или с помощью функций ADOConnection/// спасибо за ответ.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 20:48 |
|
||
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
и кстати почему именно я выбрал такой код....так только потому что такое решение предлагается в книгах....наверно там предполагается что Open(); ничего не делает при ошибке ..... или просто что-то перепутанно....ещё раз спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 20:55 |
|
||
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
Большое спасибо за ответ:) Я уже так сделал...вроде нормально у меня просто было ещё одно решение сделать откат перед выполнением ExecSQL(); но похоже оно менее логично....ещё раз большое спасибо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 23:21 |
|
||
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
для Карабас Барабас: Помнится ты спрашивал, почему я никому не рекомендую использовать VCL для доступа к базам данных? Вот и еще один довод :) Если бы Botik84 с самого начала работал с чистым ADO без прослойки VCL, то его проблемы не возникло бы вообще. В системе классов ADO это все уже давно предусмотрено и отлажено. Создаешь объект класса Command, задаешь ему параметр CommandText. Причем любую команду хоть select, хоть update, хоть вызов хранимой процедуры. Потом myRS = myCommand.Execute(...); и проверяешь получили резалт-сет или нет. А все VCL-ные классы TADOQuery и ему подобная фигня только сбивает с толку и без нужды усложняет код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2005, 00:05 |
|
||
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
White OwlА все VCL-ные классы TADOQuery и ему подобная фигня только сбивает с толку и без нужды усложняет код. как раз я бы сказал в VC перегружено через край - если не делать оберток, то текста раз в 5 больше. В BBC если UPDATE & INSERT надо пользоваться ExecSQL а если SELECT то Open. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2005, 01:28 |
|
||
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
White OwlА все VCL-ные классы TADOQuery и ему подобная фигня только сбивает с толку и без нужды усложняет код Ну я бы не стал так сгоряча все хаять Просто надо внимательно и правильно использовать библиотеки :) Тут периодически в ИБ/ФБ появляются чудаки, которые кричат, мол у меня в МССКЛ так работает, а в ФБ - нет, вывод - ФБ гамно ! Им долго объясняют потом, что в ФБ надо по-другому делать тоже самое. ПС: я не защищаю ВЦЛ, просто раз есть работоспособная библиотека, то надо просто правильно ее использовать, больших проблем не должно быть. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2005, 06:55 |
|
||
|
ADOQuery: проблема с Open(); и ExecSQL();
|
|||
|---|---|---|---|
|
#18+
Почему не работает 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 13:27 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33242178&tid=2032815]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 352ms |

| 0 / 0 |
