Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.10;
Скачать: CL | DM;

Вниз

RecordCount и все, что с ним связано   Найти похожие ветки 

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

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

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

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

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

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


 
12 ©   (2010-07-13 10:42) [1]

> Для Select count(*) нужны блокировки

вряд ли


 
И. Павел ©   (2010-07-13 10:48) [2]

> вряд ли

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


 
12 ©   (2010-07-13 10:50) [3]

> [2] И. Павел ©   (13.07.10 10:48)
> > вряд ли
>
> Ну например между выборкой и определением числа строк этой
> выборки, число строк в таблицах могло измениться. Вот и
> выйдет путанница.

число строк в таблицах может измениться всегда


 
И. Павел ©   (2010-07-13 10:57) [4]

> число строк в таблицах может измениться всегда

Насколько я понимаю, при выборке, создается временная таблица, содержащая результат. Если RecordCount работает правильно, то он возвращает именно число строк этой таблицы. А если написать SELECT count(*), то эта операция будет работать уже с общими таблицами, а они могли измениться. Хотя, может быть, я ошибаюсь.


 
12 ©   (2010-07-13 11:13) [5]

ну если так хочется можно написать

select count(*)[, 0, 0, "",]
from T
where a>b
union
select f1 [,f2, f3, f4]
from T
where a>b


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

> [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]

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


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

> но тем не менее(тоже начитавшись про 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]

ну да, т.е. = 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:19) [12]

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

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


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

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

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

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

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


 
Jeer ©   (2010-07-13 22:49) [14]

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


 
Jeer ©   (2010-07-13 22:49) [15]

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


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

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

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

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


 
Anatoly Podgoretsky ©   (2010-07-14 09:53) [17]


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

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


 
Демо ©   (2010-07-14 13:06) [18]


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


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


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

Подскажите, пожалуйтста, а метод 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]

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


 
MsGuns ©   (2010-07-14 17:25) [23]

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

Плохо искал

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

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


 
Демо ©   (2010-07-14 20:12) [24]


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


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


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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2010.10.10;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.008 c
8-1206411381
VoVan
2008-03-25 05:16
2010.10.10
При кодировании в MP3 отсутствует звук


2-1279003263
И. Павел
2010-07-13 10:41
2010.10.10
RecordCount и все, что с ним связано


2-1279517915
linuxoid
2010-07-19 09:38
2010.10.10
помогите с потоком


15-1279091543
Cannon
2010-07-14 11:12
2010.10.10
Помогите составить запрос в Interbase


2-1279354024
Student :)
2010-07-17 12:07
2010.10.10
программно свернуть чужую программу