Форум: "Начинающим";
Текущий архив: 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.003 c