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

Вниз

Как в ADOQuery можно узнать число полученных записей?   Найти похожие ветки 

 
pathfinder   (2006-02-01 21:38) [0]

Добрый вечер.
Подскажите пожалуйста как узнать сколько записей получено в результате запроса в ADOQuery?


 
Desdechado ©   (2006-02-01 21:49) [1]

ADOQuery.Last;
n := ADOQuery.RecordCount;


 
Shirson ©   (2006-02-02 07:27) [2]

ADOQuery.Last; ненужно. ADOQuery.RecordCount содержит количество записей, независимо от Last/First/Next


 
Fay ©   (2006-02-02 08:55) [3]

ADOQuery.RecordCount на самом деле не зависит от Last, но может вернуть -1 (при CursorLocation = clUseServer)


 
msguns ©   (2006-02-02 09:04) [4]

>Shirson ©   (02.02.06 07:27) [2]
>ADOQuery.RecordCount содержит количество записей, независимо от Last/First/Next

Уверен ?


 
sniknik ©   (2006-02-02 09:13) [5]

> ADOQuery.RecordCount на самом деле не зависит от Last
при асинхронном получении данных зависит, если в процессе обращения обратится. т.е. на самом деле зависит не от last, можно просто окончание выполнения по статусу проверять, но last это тоже гарантия что выборка закончится, т.к. в этом случае оно автоматически впадет в ожидание пока е выберется последняя.

а вообще, применительно к ADO нельзя вырабатывать определенные навыки работы, надо вырабатывать навыки с конкретными настройками и определенным провайдером, т.к. от них очень многое зависит. настойками можно координально поменять поведение компонент (иные движки так сильно не различаются как ADO самой собой при разных настройках), а провайдер это как бы основа, и поведения тоже... например
> но может вернуть -1 (при CursorLocation = clUseServer)
при clUseServer при подключении к провайдеру mssql или ib действительно скорее всего вернет -1, а вот access  при том же самом нормальное количество...

p.s. поэтому и не люблю "абстрактных вопросов", без конкретики, "в общем" (про ADOQuery сдесь), когда частности ВСЕ меняют и координально, общего вообще нет.


 
msguns ©   (2006-02-02 09:42) [6]

Если непременно надо узнать кол-во полученных запросом записей НД, то надежных способов 2:
1. Если известно, что в НД может быть много (тысячи) записей либо курсор серверный - получить к-во отдельным запросом

qrec := -1;
with TADOQuery.Create(nil) do
 try  
   SQL.Text := "Select count(*) from ("+ADODataSet1.CommandText+")"
   Parameters.AssignValues(ADODataSet1.Parameters);
   Open;
   qrec := Fields[0].AsInteger;
   Close;
 finally
   Free;
 end;


Правда, при этом есть одно "НО": для гарантии совпадения числа возвращенных запросом записей с числом их фактического наличия в БД на момент выборки надо этот запрос "упаковывать" в одну транзакцию с основным.

2. Если НД небольшой или курсор на клиенте, то либо FetchAll, либо First+Last с последующим
 qrec := recordcount;

И еще об ADO:

У него (в т.ч.) есть такая замечательная вещь, как клоны (метод Clone TCastomADODataSet).
Используя полученный таким образом "зеркальный" НД можно "лазать" по нему вдоль и поперек, не трогая отображаемый основной (например при поисках и сканирования для получения агрегатов). В ряде случаев это существенно снижает "тормоза"


 
Fay ©   (2006-02-02 09:59) [7]

2 msguns ©   (02.02.06 09:42) [6]
> для гарантии совпадения числа возвращенных запросом записей
Слова "фантомное чтение" Вам знакомы?


 
msguns ©   (2006-02-02 10:23) [8]

>Fay ©   (02.02.06 09:59) [7]
>Слова "фантомное чтение" Вам знакомы?

Да, я даже знаю одно высокоинтеллектуальное слово: уровень изоляции транзакций ;))

Каким боком только здесь это ? Ясно, что число записей может измениться в результате конкурентных транзакций как во время выполнения нашей транзакции, так и после отработки ее сервером и "зависания" на клиенте.
Для истинно точного соответствия выбранного пожмножества БД фактическому существует только один эффективный способ: запрет любого редактирования задействованных в запросе таблиц.



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

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

Наверх




Память: 0.49 MB
Время: 0.053 c
2-1137979351
TUpDown
2006-01-23 04:22
2006.02.19
Как изменить цвет TUpDown?


15-1138275294
dzmitry[li]
2006-01-26 14:34
2006.02.19
Pinnacle Studio Plus


15-1138683623
begin...end
2006-01-31 08:00
2006.02.19
С Днём рождения! 31 января


2-1138653644
Flint-1983
2006-01-30 23:40
2006.02.19
QReport


15-1138359877
unknowing
2006-01-27 14:04
2006.02.19
Работа с таблицами в текстовом формате