Record count что это
Свойство Recordset.RecordCount (DAO)
Область применения: Access 2013, Office 2013
Возвращает число записей, доступных в объекте Recordset, или общее количество записей в Recordset табличного типа или в объекте TableDef. Только для чтения, Long.
Синтаксис
выражение: переменная, представляющая объект Recordset.
Примечания
Используйте свойство RecordCount, чтобы узнать, ко скольким записям в объекте Recordset или TableDef получен доступ. Свойство RecordCount не указывает, сколько записей содержится в объекте Recordset типа «Динамический набор», «Статический набор» или однонаправленного типа, пока не будет получен доступ ко всем записям. После получения доступа к последней записи свойство RecordCount указывает общее число неудаленных записей в объекте Recordset или TableDef. Чтобы принудительно получить доступ к последней записи, используйте метод MoveLast объекта Recordset. Вы также можете использовать функцию SQL Count, чтобы определить приблизительное число записей, возвращаемых запросом.
Использование метода MoveLast для заполнения только что открытого объекта Recordset негативно влияет на производительность. Если не нужно получать точное значение RecordCount сразу при открытии объекта Recordset, лучше подождать заполнения объекта Recordset другими фрагментами кода, прежде чем проверять свойство RecordCount.
Когда приложение удаляет записи в объекте Recordset типа «Статический набор», значение свойства RecordCount уменьшается. Однако записи, удаленные другими пользователями, не отображаются в свойстве RecordCount, пока текущая запись расположена в удаленной записи. Если выполняется транзакция, влияющая на значение свойства RecordCount, с последующей отменой транзакции, свойство RecordCount не будет отражать фактическое количество оставшихся записей.
Свойство RecordCount объекта Recordset типа «Динамический набор» или «Статический набор» не затрагивается изменениями в базовых таблицах.
У объекта Recordset или TableDef без записей свойству RecordCount соответствует значение 0.
Использование метода Requery для объекта Recordset сбрасывает свойство RecordCount, как при повторном выполнении запроса.
Пример
В этом примере показано свойство RecordCount с разными типами объектов Recordset до и после их заполнения.
Подсчет количества записей в наборе записей DAO
Может потребоваться знать количество записей в объекте Recordset. Например, может потребоваться создать форму, которая отображает количество записей в каждой из таблиц в базе данных. Или вы можете изменить внешний вид формы или отчета в зависимости от количества записей, которые она включает.
Свойство RecordCount содержит количество записей в наборе записей типа таблицы или общее число записей, доступных в наборе записей dynaset или snapshot-type. Объект Recordset без записей имеет свойство RecordCount значение 0.
Значение свойства RecordCount равно количеству фактически доступных записей. Например, когда вы впервые создаете dynaset или снимок, вы получили доступ (или посетили) только одну запись. Если вы проверяете свойство RecordCount сразу после создания dynaset или снимка (при условии, что у него есть хотя бы одна запись), значение 1. Чтобы посетить все записи, используйте метод MoveLast сразу после открытия Recordset, а затем используйте MoveFirst, чтобы вернуться к первой записи. Это не делается автоматически, так как это может быть медленным, особенно для больших наборов результатов.
При открывлении объекта Recordset типа таблицы вы эффективно посещаете все записи в таблице, а значение свойства RecordCount равно числу записей в таблице, как только откроется Набор записей.
Отмененные транзакции могут привести к устарелим значениям свойства RecordCount в некоторых многоразмерных ситуациях. Сжатие базы данных восстанавливает количество записей таблицы до нужного значения.
В следующем примере кода создается объект Recordset типа моментального снимка, а затем определяется количество записей в Наборе записей.
Когда приложение удаляет записи в наборе записей типа dynaset, значение свойства RecordCount уменьшается. Однако в многоуровневой среде записи, удаленные другими пользователями, не отражаются в значении свойства RecordCount до тех пор, пока текущая запись не будет расположена на удаленной записи. В это время параметр свойства RecordCount уменьшается на один.
Используя метод Requery в Наборе записей, а затем метод MoveLast, задает свойство RecordCount текущее общее число записей в наборе Recordset.
Объект Recordset типа «Снимок» статичен, и значение свойства RecordCount не меняется при добавлении или удалении записей в основном таблице снимка.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Record count что это
1. Подскажите, пожалуйста, метод IsEmpty (для ADO, BDE, IB и т.д.) всегда будет работать правильно?
2. В редких случаях требуется все же узнать именно число строк в выборке, а не то, что она пустая/полная. Как лучше поступать в таких случаях? Есть что-нибудь быстрее FetchAll, но такое же удобное? Для Select count(*) нужны блокировки, думаю, это себя не оправдает, т.к. если выборка сложная, придется блокировать 10-20 таблиц – уж лучше подождать с фичем. А без блокировок можно получить актуальный count, а не тот, который относится к моей выборке. Может все же RecordCount не работает только при определенных условиях? Например, я замечал это при CursorLoaction = server. Если да, то при каких?
← →
12 © ( 2010-07-13 10:42 ) [1]
> Для Select count(*) нужны блокировки
вряд ли
> вряд ли
Ну например между выборкой и определением числа строк этой выборки, число строк в таблицах могло измениться. Вот и выйдет путанница.
← →
12 © ( 2010-07-13 10:50 ) [3]
> [2] И. Павел © (13.07.10 10:48)
> > вряд ли
>
> Ну например между выборкой и определением числа строк этой
> выборки, число строк в таблицах могло измениться. Вот и
> выйдет путанница.
число строк в таблицах может измениться всегда
> число строк в таблицах может измениться всегда
Насколько я понимаю, при выборке, создается временная таблица, содержащая результат. Если RecordCount работает правильно, то он возвращает именно число строк этой таблицы. А если написать SELECT count(*), то эта операция будет работать уже с общими таблицами, а они могли измениться. Хотя, может быть, я ошибаюсь.
ну если так хочется можно написать
select count(*)[, 0, 0, «»,]
from T
where a>b
union
select f1 [,f2, f3, f4]
from T
where a>b
> [5] 12 © (13.07.10 11:13)
Интересный способ, спасибо. Правда, потом придется первую строчку фильтровать, но в случае долгого Fetch пригодится.
← →
12 © ( 2010-07-13 11:34 ) [7]
да,
> 1. Подскажите, пожалуйста, метод IsEmpty (для ADO, BDE,
> IB и т.д.) всегда будет работать правильно?
в реализации
Result := FActiveRecord >= FRecordCount;
никогда не глючило, но тем не менее(тоже начитавшись про RC:)) стал делать
bof = eof
← →
Двенадцать © ( 2010-07-13 11:39 ) [8]
да,
> 1. Подскажите, пожалуйста, метод IsEmpty (для ADO, BDE,
> IB и т.д.) всегда будет работать правильно?
в реализации
Result := FActiveRecord >= FRecordCount;
никогда не глючило, но тем не менее(тоже начитавшись про RC:)) стал делать
bof = eof
← →
Двенадцать © ( 2010-07-13 11:40 ) [9]
> но тем не менее(тоже начитавшись про RC:)) стал делать
> bof = eof
А проверять наличие строк спомощью bof и eof нужно вот так?
if ADODataSet1.Bof and ADODataSet1.Eof then Application.MessageBox(«Ни одной записи не найдено.», 0)
else Application.MessageBox(«Записи найдены.», 0);
← →
Двенадцать © ( 2010-07-13 13:16 ) [11]
oD.SQL.Text := «select 1 from dual where 0=1»;
oD.open;
if oD.Bof and oD.Eof then ShowMessage(» пусто «);
> [11] Двенадцать © (13.07.10 13:16)
Ясно. Спасибо.
Если на клиент тащится до 1000 записей никаких тормозов быть не должно (если, конечно, сам запрос не «тяжелый» и сеть не «модемная»)
Но вообще все зависит от сервера, о котором, как обычно, партизанят
Если мсскл и курсор клиентский, то RecordCount не будет
«Боязнь RecordCount дошла до апофеоза» (С)
← →
Двенадцать © ( 2010-07-14 09:50 ) [16]
> В [5] тебе фигню насоветовали
не фигню, а первое, что пришло 🙂
← →
Anatoly Podgoretsky © ( 2010-07-14 09:53 ) [17]
> можно получить актуальный count, а не тот, который относится
> к моей выборке.
Нельзя, это процесс динамический и никогда нельзя определить актуально ли значение, даже если непрерывно делать запросы.
← →
Демо © ( 2010-07-14 13:06 ) [18]
Зависит от типа изоляции транзакций. В справке написано в каком случае будет возвращено правильное значение.
Подскажите, пожалуйтста, а метод IsEmpty будет всегда правильно работать (в BDE, ADO, IB и т.д)? Просто в справке сказано про недостатки RecordCount, а в статье про IsEmpty написано только его назначение, и никаких предупреждений.
> Зависит от типа изоляции транзакций. В справке написано
> в каком случае будет возвращено правильное значение.
В какой справке? По Delphi этого не нашел.
← →
Двенадцать © ( 2010-07-14 13:56 ) [20]
> Подскажите, пожалуйтста, а метод IsEmpty будет всегда правильно
> работать (в BDE, ADO, IB и т.д)? Просто в справке сказано
> про недостатки RecordCount, а в статье про IsEmpty написано
> только его назначение, и никаких предупреждений.
function TDataSet.IsEmpty: Boolean;
begin
Result := FActiveRecord >= FRecordCount;
end;
однофигственно же на RecordCount смотрит
← →
Демо © ( 2010-07-14 14:35 ) [21]
> И. Павел © (14.07.10 13:48) [19]
> По Delphi этого не нашел.
Сейчас не могу посмотреть. Дома постараюсь глянуть не забыть.
← →
Anatoly Podgoretsky © ( 2010-07-14 16:23 ) [22]
> И. Павел (14.07.2010 13:48:19) [19]
А не о чем предупреждать. Реализацию метода можешь посмотреть в исходниках.
>И. Павел © (14.07.10 13:48) [19]
>В какой справке? По Delphi этого не нашел.
Например, в справке по ADOConnection есть про изоляцию,
в справке о TIBTransaction тоже есть, но иное
Я уже выше намякивал на сервер, но очевидно Чапая интересует исключительно калибр патронов 🙂
← →
Демо © ( 2010-07-14 20:12 ) [24]
> В какой справке? По Delphi этого не нашел.
В справке мутновато написано.
И ошибся я. С уровнем изоляции это не связано. Связано с типом курсора.
Для CursorLocation=clUseClient должно показываться правильное количество записей.
> Я уже выше намякивал на сервер
В основном ADO + (MS SQL SERVER или Access)
Пока что ошибок ни с RecordCount ни с IsEmpty не замечал (курсор у меня всегда клиентский по умолчанию).
Record count что это
Описание
Возвращает число записей, к которым был осуществлен доступ в объекте Recordset, или полное число записей в табличном объекте Recordset или объекте TableDef.
Значение
Возвращаемое значение имеет тип Long.
Замечания
Свойство RecordCount используется для определения числа записей объекта Recordset или TableDef, к которым проводилось обращение. Свойство RecordCount не показывает, сколько записей содержится в динамическом или статическом объекте Recordset до обращения ко всем записям. После обращения к последней записи набора значение свойства RecordCount становится равным полному числу неудаленных записей в объекте Recordset или TableDef. Для принудительного обращения к последней записи следует вызвать для объекта Recordset метод MoveLast. Кроме того, определить примерное число записей, которые будут возвращены в запросе, позволяет функция Count языка SQL.
Заполнение с помощью метода MoveLast объекта Recordset при его открытии отрицательно сказывается на быстродействии. Если точное определение значения свойства RecordCount не требуется сразу после открытия объекта Recordset, рекомендуется подождать, пока объект Recordset будет заполнен в результате выполнения остальной программа, а уже потом обращаться к свойству RecordCount.
По мере удаления записей из динамического набора в процессе работы приложения значение свойства RecordCount уменьшается. Однако удаление записей другими пользователями не отражается на значении данного свойства до тех пор, пока указатель текущей записи не будет установлен на одну из удаленных записей. Если выполняется транзакция, изменяющая значение свойства RecordCount, а затем эта транзакция свертывается, значение свойства RecordCount не будет отражать реальное число оставшихся записей.
Изменения, вносимые в базовые таблицы, не влияют на значение свойства RecordCount объекта Recordset типа статического набора записей или статического набора записей с последовательным доступом.
Для объектов Recordset или TableDef, не содержащих записей, свойство RecordCount всегда имеет значение 0.
Для присоединенных объектов TableDef свойство RecordCount всегда имеет значение –1.
При вызове метода Requery для объекта Recordset значение свойства RecordCount изменяется так же, как и при повторном выполнении запроса.
Пример
Следующая программа демонстрирует применение свойства RecordCount для различных типов объектов Recordsets до и после их заполнения.
Recordset.RecordCount property (DAO)
Applies to: Access 2013, Office 2013
Returns the number of records accessed in a Recordset object, or the total number of records in a table-type Recordset object. or TableDef object. Read-only Long.
Syntax
expression A variable that represents a Recordset object.
Remarks
Use the RecordCount property to find out how many records in a Recordset or TableDef object have been accessed. The RecordCount property doesn’t indicate how many records are contained in a dynaset–, snapshot–, or forward–only–type Recordset object until all records have been accessed. Once the last record has been accessed, the RecordCount property indicates the total number of undeleted records in the Recordset or TableDef object. To force the last record to be accessed, use the MoveLast method on the Recordset object. You can also use an SQL Count function to determine the approximate number of records your query will return.
Using the MoveLast method to populate a newly opened Recordset negatively impacts performance. Unless it is necessary to have an accurate RecordCount as soon as you open a Recordset, it’s better to wait until you populate the Recordset with other portions of code before checking the RecordCount property.
As your application deletes records in a dynaset-type Recordset object, the value of the RecordCount property decreases. However, records deleted by other users aren’t reflected by the RecordCount property until the current record is positioned to a deleted record. If you execute a transaction that affects the RecordCount property setting and you subsequently roll back the transaction, the RecordCount property won’t reflect the actual number of remaining records.
The RecordCount property of a snapshot– or forward–only–type Recordset object isn’t affected by changes in the underlying tables.
A Recordset or TableDef object with no records has a RecordCount property setting of 0.
Using the Requery method on a Recordset object resets the RecordCount property just as if the query were re-executed.
Example
This example demonstrates the RecordCount property with different types of Recordsets before and after they’re populated.