Форум: "Базы";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c