Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.012 c
1-47315
SDv-503
2002-07-01 00:17
2002.07.15
Как программно нажать на .... (+)


3-47159
MikeFW
2002-06-18 16:33
2002.07.15
Очень надо ускорить работу TreeView


3-47092
VAleksey
2002-06-20 07:48
2002.07.15
Query.Open против ExecSQL


7-47822
Softmaster
2002-04-21 08:27
2002.07.15
Проблема с печатью!


1-47562
Igorek
2002-06-24 23:43
2002.07.15
TypInfo.pas - недокументированные возможности





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский