![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в 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;