![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RecordCount и все, что с ним связано
И. Павел © (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 пригодится.