Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.15;
Скачать: CL | DM;

Вниз

Query.Open против ExecSQL   Найти похожие ветки 

 
VAleksey ©   (2002-06-20 07:48) [0]

Господа, мною подмечен (уже давно) любопытный факт:
Open выполняет все SQL запросы даже апдейт и делит. При этом возникает ошибка Error creating cursor handle. Собственно вопрос :
Как вы думаете не будет ли каких непредсказуемых последствий если вместо кода:
Try
Query.Open;
Except
Query.ExecSQL;
end;
писать просто:
Try
Query.Open;
Except
end;

?


 
ef2000   (2002-06-20 08:09) [1]

> VAleksey
ИМХО для запросов не возвращающих результаты нужно использовать ExecSQL


 
DarkGreen   (2002-06-20 09:26) [2]

Из Delphi Help

procedure ExecSQL;
Description
Call ExecSQL to execute the SQL statement currently assigned to the SQL property. Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE).

Note: For SELECT statements, call Open instead of ExecSQL.


 
Kaban ©   (2002-06-20 09:35) [3]

Try
Query.Open;
Except
Query.ExecSQL;
end;
Если уж вы это заметили, то запрос из этого кода будет выполняться два раза. И вообще к чему это все.


 
Александр Спелицин   (2002-06-20 19:41) [4]

Если Вы не знаете, что внутри вашего запроса (Select, Insert, ...) то попробуйте так:
try
Query.Open;
except
on E: Exception do
if E is ENoResultSet then
begin
end
else raise;
end;

А в конструкции
try
Query.Open;
except
Query.ExecSQL;
end;
запросы Insert, Update, ... действительно будут выполнены дважды.


 
kaif ©   (2002-06-21 04:25) [5]

if pos("SELECT", AnsiUpperCase(trim(Query.SQL.Text))) = 0 then
Query.ExecSQL
else
Query.Open

Мне так КАЖЕТСЯ :))


 
kaif ©   (2002-06-21 04:27) [6]

Пардон:
if pos("SELECT", AnsiUpperCase(trim(Query.SQL.Text))) = 1 then
Query.Open
else
Query.ExecSQL

(так как SELECT может быть частью выражения UPDATE)


 
VAleksey ©   (2002-06-21 07:59) [7]

Ваше мнение ясно. Насчет HELP - так там всегда много чего написано, и бывает довольно туманно. Во первах там нигде не сказано что НЕЛЬЗЯ использовать Open вместо ExecSQL при этом подавляя сообщение об ошибке (см. выше).
Причем механизм выполнения запросов д.б. следующий при использовании open (ИМХО)
1)Выполняется запрос
2) проверяется наличие предполагаемого курсора
3) если курсора нет, то сообщение об ошибке.
Но запрос действительно выполняется !


 
panov ©   (2002-06-21 08:14) [8]

Такое использование TQuery некорректно и ведет к ошибкам при использовании.

Пример:
Предположим, что необходимо выполнить запрос
"SELECT * from mytable"
В случае, если mytable не существует, возникнет Exception, которая будет успешно подавлена.

После выполнения

try
Query1.Open;
except
end;


при попытке обращения за данными к Query1 опять возникнет Exception.


 
VAleksey ©   (2002-06-21 10:09) [9]


> panov © (21.06.02 08:14)

Не ну вы даете господин Панов ... Неужели вы думаете, что я именно такой код буду в приложении использовать ? Это же просто концептуальный пример !


 
panov ©   (2002-06-21 13:25) [10]

Проще свою функцию написать, например такую:
function QOpen(var Q: TQuery;sql: String): Boolean;
begin
Result := True;
try
if UpperCase(Copy(sql,1,6)) = "SELECT" then Q.Open
else Q.ExecSql;
except
Result := False;
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2002.07.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
14-47759
Феминистка
2002-05-25 13:17
2002.07.15
Мужики


3-47087
pavelB
2002-06-20 14:32
2002.07.15
не отображаются LookUp поля


4-47862
anod
2002-05-09 23:56
2002.07.15
Текст меню по идентификатору


3-47147
Blunder
2002-06-25 07:16
2002.07.15
Выполнение SQL скриптов из приложения


1-47540
Shirson
2002-06-27 08:04
2002.07.15
Программа на другой машине...