Главная страница
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.015 c
15-1225077576
Slider007
2008-10-27 06:19
2008.12.28
С днем рождения ! 27 октября 2008 понедельник


4-1202738807
Unicode
2008-02-11 17:06
2008.12.28
TLogFontW и DrawTextW


2-1227036079
front
2008-11-18 22:21
2008.12.28
Объявление переменной


15-1225349122
passlight
2008-10-30 09:45
2008.12.28
Следи за кредитом, будь осторожен...


15-1224967937
Kolan
2008-10-26 00:52
2008.12.28
А хотите задачку из области разработки интерфейсов?