Главная страница
    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.01 c
1-47500
farhad
2002-07-04 12:38
2002.07.15
Уважаемые програмисты, помогите советом


1-47545
Ал
2002-06-27 18:02
2002.07.15
Процедура(функция)


14-47695
Nest
2002-06-17 16:29
2002.07.15
Прощаюсь, дамы и господа :~~(


3-47144
Jony
2002-06-18 16:03
2002.07.15
Работа с картинками *.jpg в Delphi/MS SQL


6-47655
Mikalai
2002-05-06 22:30
2002.07.15
HTTP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский