Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ничего не понимаю!!!


Константин ©   (2002-01-16 16:33:00) 

Ставлю на форму TQuery, линкую к BDE,
делаю АDD("Select * from Table"),
Вызываю ExecSQL 1000 раз,
на 254 исключение - слишком много открытых таблиц.
Что не так?


Andrey007   (2002-01-16 16:54:00) [1]

Во-первых, Вам Константин, совершенно правильно сказали по поводу того, что для SELECT-запроса надо делать TQuery.Open, а не TQuery.ExecSQL.
Во-вторых, если вы меняете параметры запроса 1000 раз, то совершенно нерационально каждый раз менять текст запроса, поскольку в таком случае 1000 раз происходит проверка синтаксиса SQL-запроса. Поэтому гораздо лучше в таком случае использовать параметрический запрос. Параметр в нём задаётся так:
Select * From Table
Where Field1= :Parameter
Потом в Object Inspector"e для этого запроса настраиваете тип параметра через свойство TParams.
Затем в программе пишете, например
Query1.Close;
Query1.ParamByName("Parameter").AsFloat:=1;
Query1.Open;
В таком случае проверка синтаксиса происходит только один раз.


Nest   (2002-01-16 16:53:00) [2]

Вообще твой "тест-код" заведомо нерабочий.
Вот такой код у меня работает без проблем:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
query1.close;
query1.sql.text:="select * from log.dbf";
for i:=0 to 256 do
begin
query1.close;
query1.open;
application.processmessages;
end;
end;


Nest   (2002-01-16 16:44:00) [3]

Согласен с Praco ©.
+Вообще не вижу смысла в таком куске!
Поясни зачем такое черезж...во?


Константин   (2002-01-16 16:44:00) [4]

Да, наверное в этом и проблема. Буду тестить.


Константин   (2002-01-16 16:43:00) [5]

Надо столько раз, поскольку меняю параметры запроса, а это уже тестовый пример.


Belov   (2002-01-16 16:42:00) [6]

Ну вообщето ExeсSQL используется только при DELETE, UPDATE
При SELECT используется только Query.Open


Praco   (2002-01-16 16:40:00) [7]

Не ExecSql, а Open и зачем столько раз?


Константин   (2002-01-16 16:40:00) [8]

Вот тестовый примерчик:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
query1.SQL.Add("SELECT * from trendDef");
for i := 1 to 1000 do
begin
query1.ExecSQL;
button1.Caption := inttostr(i);
end;

end;

Таблица в парадоксе, годится любая. Пробовал создавать Query динамически и тут же его удалять, не выходи. Все равно исключение!


Nest   (2002-01-16 16:35:00) [9]

Код приведи - у меня подобная проблема была решил.


Наверх

Титульная страница Поиск, карта сайта Написать письмо