Форум: "Начинающим";
Текущий архив: 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