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

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

Как в ADOQuery можно узнать число полученных записей? [D6, 2000]


pathfinder ©   (2006-02-01 21:38:00) 

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


msguns   (2006-02-02 10:23:00) [1]

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

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

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


Fay   (2006-02-02 09:59:00) [2]

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


msguns   (2006-02-02 09:42:00) [3]

Если непременно надо узнать кол-во полученных запросом записей НД, то надежных способов 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).
Используя полученный таким образом "зеркальный" НД можно "лазать" по нему вдоль и поперек, не трогая отображаемый основной (например при поисках и сканирования для получения агрегатов). В ряде случаев это существенно снижает "тормоза"


sniknik   (2006-02-02 09:13:00) [4]

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

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

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


msguns   (2006-02-02 09:04:00) [5]

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

Уверен ?


Fay   (2006-02-02 08:55:00) [6]

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


Shirson   (2006-02-02 07:27:00) [7]

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


Desdechado   (2006-02-01 21:49:00) [8]

ADOQuery.Last;
n := ADOQuery.RecordCount;


Наверх

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