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

Вниз

Query.Eof или Query.recordcount.   Найти похожие ветки 

 
noob_one   (2008-11-17 16:28) [0]

Какой вариант правильнее использовать для обработки всех строк запроса?

Возник спор.

Я пользуюсь
while not Query.Eof do
begin
 ...
 Query.next;
end;


Человек настаивает на

rec:=Query.RecordCount;
i:=0;
while i<rec do
 begin
  ...
  inc(i);
  Query.next;
 end;
   

На тестах оба варианта отрабатывали примерно равное время. Какой все же правильный? И каким тестом это можно выявить?


 
Sergey13 ©   (2008-11-17 16:34) [1]

Попроси человека отработать свой вариант например на интербейсовском сервере.
Ну или справку по RecordCount почитать.


 
Anatoly Podgoretsky ©   (2008-11-17 16:34) [2]

> noob_one  (17.11.2008 16:28:00)  [0]

Человека выгнать на переобучение.


 
Palladin ©   (2008-11-17 16:39) [3]


> Какой все же правильный?

вне всяких сомнений Eof


> И каким тестом это можно выявить?

создаете базу mdb (Access)
создаете таблицу test любой структуры, заносите несколько записей

q:=TADOQuery.Create(Nil);
Try
 q.ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyDocuments\db3.mdb;Persist Security Info=False";
 q.CursorType:=ctOpenForwardOnly;
 q.sql.text:="select * from test";
 q.Open;
 ShowMessage(IntToStr(q.RecordCount));
 q.Close;
Finally
 q.Free;
End;


и друг, с визгом дикого поросенка, признает свою неправоту... и компенсирует моральный ущерб...


 
Ega23 ©   (2008-11-17 16:43) [4]


> Какой вариант правильнее использовать для обработки всех
> строк запроса?


TDataSet.RecordCount + F1


 
noob_one   (2008-11-17 16:45) [5]

>
> Попроси человека отработать свой вариант например на интербейсовском
> сервере.
> Ну или справку по RecordCount почитать.


Дело в том, что человек работает на Interbase и справка ему не указ. 8-(

Note: Use RecordCount with care, because record counting can be a costly operation, especially for SQL queries that return large result sets. Generally, an application should only use RecordCount with Paradox and dBASE tables.

Утверждает, что некоторые обработки при применении второго варанта работают быстрее. Показать, правда, отказался.


 
noob_one   (2008-11-17 16:46) [6]

> [1] Sergey13 ©   (17.11.08 16:34)
> Попроси человека отработать свой вариант например на интербейсовском
> сервере.
> Ну или справку по RecordCount почитать.


Дело в том, что он как раз работает на Interbase и справка ему не указ. утверждает что некоторые обработки стали работать быстрее.


 
Anatoly Podgoretsky ©   (2008-11-17 16:49) [7]

> Ega23  (17.11.2008 16:43:04)  [4]

Плюс курсоры


 
Sergey13 ©   (2008-11-17 16:57) [8]

> [5] noob_one   (17.11.08 16:45)

Что то сомнительно мне что указанный код без доработок будет правильно работать на ИБ чеерз БДЕ.


 
noob_one   (2008-11-17 17:02) [9]

> Что то сомнительно мне что указанный код без доработок будет
> правильно работать на ИБ чеерз БДЕ.

В том-то и дело, что все запросы исправно возвращают Recordcount.

Может действительно есть какая-то доработка. Ее можно каким-либо образом обнаружить?


 
Anatoly Podgoretsky ©   (2008-11-17 17:04) [10]

> noob_one  (17.11.2008 17:02:09)  [9]

Зачем?
Когда есть работающий во всех случаях первый вариант, что за желание играть в рулетку?


 
noob_one   (2008-11-17 17:06) [11]

Я проверял на разных запросах.

безо всяких fetchall. просто

Query.Open;
rec:=Query.RecordCount;

срабатывает


 
noob_one   (2008-11-17 17:07) [12]

> Когда есть работающий во всех случаях первый вариант, что
> за желание играть в рулетку?


Говорит стало намного быстрее...


 
Сергей М. ©   (2008-11-17 17:22) [13]


> срабатывает


RecordCount обязано либо вернуть некое ц/ч значение N >= 0 ("сработало") либо возбудить исключение ("не сработало")

Т.е. ты не получил исключение, так ?


 
noob_one   (2008-11-17 17:35) [14]

> Т.е. ты не получил исключение, так ?

Да.

И на проверенных запросах это число совпадает с количеством строк результата.

Количество строк небольшое - до 2000.


 
Сергей М. ©   (2008-11-17 18:53) [15]


> на проверенных запросах


С произвольным курсором ?
С сервером на хосте в Задрищенске ?


 
asail   (2008-11-17 18:58) [16]

А в BDE оно и должно работать... А вот в IBX не будет однозначно!
Мы тут как-то переходили с BDE на IBX - пришлось все RecordCount на EOF менять, а иначе - никак.


 
Сергей М. ©   (2008-11-17 19:13) [17]


>  в BDE оно и должно работать


Эт что, в Талмуте так завещано ?
Или отсебячина ?


 
asail   (2008-11-17 20:19) [18]


> Сергей М. ©   (17.11.08 19:13) [17]
>
> >  в BDE оно и должно работать
>
>
> Эт что, в Талмуте так завещано ?
> Или отсебячина ?

С практики собственной... Хотя самому странно - я понимаю, что RecordCount возвращает кол-во закэшированных в датасете записей, но вот у нас несколько прог работало с десяток лет и ничего - значения возвращались верные, даже на датасетах в сотни тысяч записей... Причем, в параметрах BDE-алиаса всегда стояло по дефолту: "BATCH COUNT = 200". Перевести все поголовно на Eof пришлось при переходе c BDE на IBX.
Так-что можно считать отсебячиной... :-)


 
Сергей М. ©   (2008-11-17 20:27) [19]


> Так-что можно считать отсебячиной.


Оно и видно.

BDE <> Paradox


 
MsGuns ©   (2008-11-17 21:50) [20]

аднака развод


 
asail   (2008-11-17 22:20) [21]


> BDE <> Paradox

Причем тут Paradox?.. Ну да ладно...



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

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

Наверх




Память: 0.51 MB
Время: 0.012 c
15-1225338523
TUser
2008-10-30 06:48
2008.12.28
Шлюз между Рунетом и остальной Сетью


2-1227094803
Golden
2008-11-19 14:40
2008.12.28
Вопросик по StringReplace


15-1225463695
Циркуль
2008-10-31 17:34
2008.12.28
Нашел какую-то фичу (может глюк) в D6...


2-1226949763
Чудак
2008-11-17 22:22
2008.12.28
TidTCPClient сколько данных передали?


2-1226904399
Rav4
2008-11-17 09:46
2008.12.28
Подсчитать вещественные числа в Listbox