Главная страница
    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.039 c
15-1138630265
Суслик
2006-01-30 17:11
2006.02.19
Про XHTML


9-1125311577
Chel
2005-08-29 14:32
2006.02.19
Вопрос по OpenGL


2-1138978461
Дмитрий_177
2006-02-03 17:54
2006.02.19
Повторить какуюнибудь процедуру или функцию несколько раз


2-1138731187
Arazel
2006-01-31 21:13
2006.02.19
Error: Ambiguous colum name C_Cost (ADOTable.SQL)


6-1131726960
jimmy
2005-11-11 19:36
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский