![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
технология ADO и RecordCount [D7, XP]
Delphi2020 © (2009-10-20 19:51:00)Уважаемые мастера, такой вот у меня созрел вопрос:
Где-то слышал, что использование технологии BDE может привести к тому, что свойство RecordCount (например в Query) покажет неправильный результат, т.к. не все строчки считаются.
Так вот, вопрос – подвержен ли ADOQuery такому-же глюку?
PS: ни в Query, ни в ADOQuery поймать этот глюк так и не получилось.
qwer_qwer (2009-10-21 00:53:00) [21]PS.
СУБД MSSQL SERVER 2005.
Запрос простой - select * from MyTable
qwer_qwer (2009-10-21 00:52:00) [22]
> Плохиш © (20.10.09 23:08) [18]
> Странно, у меня всегда он равен -1
> и это не ошибка.А пустой набор данных это, когда, сразу
> после открытия, eof = true.
У меня TADOQuery возвращает нормальное значение почему-то...
palva (2009-10-20 23:46:00) [23]
> пустой набор - это когда IsEmpty = true ;)
А я привык для этого проверять EOF сразу после открытия. Поскольку isEmpty в чистом ADO нет. Наверняка делается что-то в роде IsEmpty := EOF AND BOF
Игорь Шевченко (2009-10-20 23:26:00) [24]
> А пустой набор данных это, когда, сразу после открытия,
> eof = true
пустой набор - это когда IsEmpty = true ;)
Плохиш (2009-10-20 23:08:00) [25]
> Delphi2020 (20.10.09 20:20) [8]
>
>
> > RecordCount вернёт тебе правильное значение или -1.
>
> Спасибо, это выриант. После каждого open буду проверять
> if RecordCount=-1 then MessageBox('Ошибка').
Странно, у меня всегда он равен -1 и это не ошибка.
А пустой набор данных это, когда, сразу после открытия, eof = true.
palva (2009-10-20 21:37:00) [26]qwer_qwer (20.10.09 20:49) [16]
Ну вот я попробовал. SQL Server 2005 Express
ADODataSet1 имеет:
ConnectionString Provider=SQLNCLI;Server=.\SQLEXPRESS;Trusted_Connection=yes;
CommandText select * from ...
CursorLocation clUseServer
CursorType ctDynamic
По клику кнопки выполняется:
ADODataSet1.Open;
ShowMessage(IntToStr(ADODataSet1.RecordCount));
ShowMessage(IntToStr(ADODataSet1.Fields[0].AsInteger));
Сначала показывает -1
потом значение первого поля первой записи.
А какие могут быть разъяснения? Так работает и всё. Сервер не знает сколько записей на самом деле будет прочитано из датасета и дает только первые записи, по мере их чтения происходит подкачка дополнительных записей. А сколько записей всего сервер даже и не знает. Кроме того, их количество может меняться по мере чтения датасета.
qwer_qwer (2009-10-20 20:49:00) [27]Может кто подскажет тогда - в каком случае RecordCount вернёт неверное значение? Я с таким не сталкивался и не встречал разъяснений.
qwer_qwer (2009-10-20 20:48:00) [28]Так я не пойму, в чём у тебя вопрос.
RecordCount=-1 у меня не возникало такого.
RecordCount возвращает праавильное значение количества записей, которые вернула СУБД по запросу.
Delphi2020 (2009-10-20 20:28:00) [29]Т.е. if RecordCount=-1 then
begin
Mesag...
Abort
end;
Иначе через next, как я понимаю, пройдут только RecordCount строк или еще где ошибка вылезет.
Delphi2020 (2009-10-20 20:25:00) [30]База SQL 2005.
Думаю, что если RecordCount<>Тому, что действительно должно было вернуться по запросу, то это уже можно расценивать как ошибку и сообщать пользователю.
qwer_qwer (2009-10-20 20:24:00) [31]Какая хоть СУБД?
qwer_qwer (2009-10-20 20:23:00) [32]
> После каждого open буду проверять if RecordCount=-1 then
> MessageBox('Ошибка').
Для проверки есть свойство isEmpty.
Delphi2020 (2009-10-20 20:22:00) [33]Не нужно это тебе, при наличии одноименной с задачей функцией.
А Open всегда возвращает действительное число строк в выборке???
qwer_qwer (2009-10-20 20:21:00) [34]
> да, это я уже понял - показывается число строк в датасете.
> Но мне нужно число строк в выборке,
Они совпадают.
Delphi2020 (2009-10-20 20:20:00) [35]
> RecordCount вернёт тебе правильное значение или -1.
Спасибо, это выриант. После каждого open буду проверять if RecordCount=-1 then MessageBox('Ошибка').
> Если выборка короткая, то просто используй для гарантии
> дополнительный запрос SELECT COUNT().
Увы, выборки обычно тяжелые. Кроме того, если как-то не встраивать count в основной запрос, может возникнуть такой вариант, когда второй пользователь введет еще строку и count окажется больше на единицу...
Anatoly Podgoretsky (2009-10-20 20:19:00) [36]> Delphi2020 (20.10.2009 20:09:04) [4]
Не нужно это тебе, при наличии одноименной с задачей функцией.
qwer_qwer (2009-10-20 20:16:00) [37]
> Но мне нужно число строк в выборке, ну и иметь возможность
> определять - пустая ли выборка вернулась.
Так кто ж мешает?
RecordCount вернёт тебе правильное значение или -1. Всего лишь.
Если выборка короткая, то просто используй для гарантии дополнительный запрос SELECT COUNT().
Delphi2020 (2009-10-20 20:15:00) [38]Кстати, сколько не пользуюсь ADOQuery, такой особенности RecordCount не замечал... Может быть не выводятся только какие-нибудь служебные записи, и дело не в нехватке памяти? Или наоборот - есть какой-то порог числа записей в датасете, и все, что за ним, не считывается?
Delphi2020 (2009-10-20 20:09:00) [39]Anatoly Podgoretsky © да, это я уже понял - показывается число строк в датасете. Но мне нужно число строк в выборке, ну и иметь возможность определять - пустая ли выборка вернулась.
Anatoly Podgoretsky (2009-10-20 20:07:00) [40]> Delphi2020 (20.10.2009 19:51:00) [0]
А зачем сравнивать технологию и отдельный компонент.
Кроме того RecordCount всегда покажет правильный результат, только он тебе может не понравится.