Главная страница
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.036 c
15-1138706670
YurikGL
2006-01-31 14:24
2006.02.19
ГОСТ на маркировку


15-1138286833
Игорь Шевченко
2006-01-26 17:47
2006.02.19
Вот вам и ReactOS :)


2-1138617068
box
2006-01-30 13:31
2006.02.19
Связь адотабле и адоКвери


2-1138793071
sergeii
2006-02-01 14:24
2006.02.19
Label ?


2-1138649839
azeton
2006-01-30 22:37
2006.02.19
Помогите написать формулу