Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RecordCount и все, что с ним связано


Страницы:   1 2

И. Павел ©   (2010-07-13 10:41:00) 

Здравствуйте.

Уже давно встречаю в сети (да и в справке это есть) информацию о том, что RecordCount может содержать не число строк выборки, а -1 или другое значение.
В связи с этим у меня возникла пара вопросов:

1. Подскажите, пожалуйста, метод IsEmpty (для ADO, BDE, IB и т.д.) всегда будет работать правильно?

2. В редких случаях требуется все же узнать именно число строк в выборке, а не то, что она пустая/полная. Как лучше поступать в таких случаях? Есть что-нибудь быстрее FetchAll, но такое же удобное? Для Select count(*) нужны блокировки, думаю, это себя не оправдает, т.к. если выборка сложная, придется блокировать 10-20 таблиц – уж лучше подождать с фичем. А без блокировок можно получить актуальный count, а не тот, который относится к моей выборке. Может все же RecordCount не работает только при определенных условиях? Например, я замечал это при CursorLoaction = server. Если да, то при каких?

Заранее спасибо.


И. Павел   (2010-07-15 08:09:00) [1]

> Я уже выше намякивал на сервер

В основном ADO + (MS SQL SERVER или Access)
Пока что ошибок ни с RecordCount ни с IsEmpty не замечал (курсор у меня всегда клиентский по умолчанию).


[24] Демо ©   (14.07.10 20:12)

Ясно, спасибо.


Демо   (2010-07-14 20:12:00) [2]


> В какой справке?  По Delphi этого не нашел.


В справке мутновато написано.
И ошибся я. С уровнем изоляции это не связано. Связано с типом курсора.
Для CursorLocation=clUseClient должно показываться правильное количество записей.


MsGuns   (2010-07-14 17:25:00) [3]

>И. Павел ©   (14.07.10 13:48) [19]
>В какой справке? По Delphi этого не нашел.

Плохо искал

Например, в справке по ADOConnection есть про изоляцию,
в справке о TIBTransaction тоже есть, но иное  

Я уже выше намякивал на сервер, но очевидно Чапая интересует исключительно калибр патронов :)


Anatoly Podgoretsky   (2010-07-14 16:23:00) [4]

> И. Павел  (14.07.2010 13:48:19)  [19]

А не о чем предупреждать. Реализацию метода можешь посмотреть в исходниках.


Демо   (2010-07-14 14:35:00) [5]


> И. Павел ©   (14.07.10 13:48) [19]
>  По Delphi этого не нашел.


Сейчас не могу посмотреть. Дома постараюсь глянуть не забыть.


Двенадцать   (2010-07-14 13:56:00) [6]

> Подскажите, пожалуйтста, а метод IsEmpty будет всегда правильно
> работать (в BDE, ADO, IB и т.д)? Просто в справке сказано
> про недостатки RecordCount, а в статье про IsEmpty написано
> только его назначение, и никаких предупреждений.

function TDataSet.IsEmpty: Boolean;
begin
 Result := FActiveRecord >= FRecordCount;
end;
однофигственно же на RecordCount смотрит


И. Павел   (2010-07-14 13:48:00) [7]

Подскажите, пожалуйтста, а метод IsEmpty будет всегда правильно работать (в BDE, ADO, IB и т.д)? Просто в справке сказано про недостатки RecordCount, а в статье про IsEmpty написано только его назначение, и никаких предупреждений.


> Зависит от типа изоляции транзакций. В справке написано
> в каком случае будет возвращено правильное значение.

В какой справке? По Delphi этого не нашел.


Демо   (2010-07-14 13:06:00) [8]


> Уже давно встречаю в сети (да и в справке это есть) информацию
> о том, что RecordCount может содержать не число строк выборки,
>  а -1 или другое значение.


Зависит от типа изоляции транзакций. В справке написано в каком случае будет возвращено правильное значение.


Anatoly Podgoretsky   (2010-07-14 09:53:00) [9]


> можно получить актуальный count, а не тот, который относится
> к моей выборке.

Нельзя, это процесс динамический и никогда нельзя определить актуально ли значение, даже если непрерывно делать запросы.


Двенадцать   (2010-07-14 09:50:00) [10]

> В [5] тебе фигню насоветовали

не фигню, а первое, что пришло :)

а чем мотивируете?


Jeer   (2010-07-13 22:49:00) [11]

Удалено модератором


Jeer   (2010-07-13 22:49:00) [12]

"Боязнь RecordCount дошла до апофеоза" (С)


MsGuns   (2010-07-13 21:36:00) [13]

Если на клиент тащится до 1000 записей никаких тормозов быть не должно (если, конечно, сам запрос не "тяжелый" и сеть не "модемная")

Но вообще все зависит от сервера, о котором, как обычно, партизанят

Если мсскл и курсор клиентский, то RecordCount не будет < 0

В [5] тебе фигню насоветовали


И. Павел   (2010-07-13 13:19:00) [14]

> [11] Двенадцать ©   (13.07.10 13:16)

Ясно. Спасибо.


Двенадцать   (2010-07-13 13:16:00) [15]

ну да, т.е. = true

oD.SQL.Text := 'select 1 from dual where 0=1';
oD.open;
if oD.Bof and oD.Eof then ShowMessage(' пусто ');


И. Павел   (2010-07-13 13:07:00) [16]

> но тем не менее(тоже начитавшись про RC:)) стал делать
> bof = eof

А проверять наличие строк спомощью bof и eof нужно вот так?

if ADODataSet1.Bof and ADODataSet1.Eof then Application.MessageBox('Ни одной записи не найдено.', 0)
else Application.MessageBox('Записи найдены.', 0);


Двенадцать   (2010-07-13 11:40:00) [17]

клиент наверное проглючил - извинения
что-то я уже под 12(с) не могу писать


Двенадцать   (2010-07-13 11:39:00) [18]

да,
> 1. Подскажите, пожалуйста, метод IsEmpty (для ADO, BDE,
> IB и т.д.) всегда будет работать правильно?

в реализации
Result := FActiveRecord >= FRecordCount;

никогда не глючило, но тем не менее(тоже начитавшись про RC:)) стал делать
bof = eof


12   (2010-07-13 11:34:00) [19]

да,
> 1. Подскажите, пожалуйста, метод IsEmpty (для ADO, BDE,
> IB и т.д.) всегда будет работать правильно?

в реализации
Result := FActiveRecord >= FRecordCount;

никогда не глючило, но тем не менее(тоже начитавшись про RC:)) стал делать
bof = eof


И. Павел   (2010-07-13 11:19:00) [20]

> [5] 12 ©   (13.07.10 11:13)

Интересный способ, спасибо. Правда, потом придется первую строчку фильтровать, но в случае долгого Fetch пригодится.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо