Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Вниз

Как в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.042 c
2-1138532375
einstein
2006-01-29 13:59
2006.02.19
Обработка сворачивания не главной формы приложения


3-1135523459
turonix
2005-12-25 18:10
2006.02.19
Проблемы при создании ограничения на поле типа Date в Access


15-1138709234
Digitman
2006-01-31 15:07
2006.02.19
Разыскиваю человека. Москвичи, помогите в пределах возможного...


1-1137584481
UnDISCOvery
2006-01-18 14:41
2006.02.19
NTFS - Как быстро заполнить жесткий диск?


2-1138351597
СержК
2006-01-27 11:46
2006.02.19
Как грамотно остановить, убить поток





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский