Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.004 c
15-1279013407
Knight
2010-07-13 13:30
2010.10.10
Почему TServerSocket при отключении клиента...


2-1278787052
Nikfel
2010-07-10 22:37
2010.10.10
Как из RichEdit получить и засунуть текст в формате RTF?


2-1279538562
fib
2010-07-19 15:22
2010.10.10
TpFIBDataSet вызвать SQL Generator в Run-time


6-1226223112
diks
2008-11-09 12:31
2010.10.10
Помогите с кодом в CodeGear RAD Studio 2007


15-1278792046
Kerk
2010-07-11 00:00
2010.10.10
Посоветуйте WiFi-роутер





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