Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

технология ADO и RecordCount [D7, XP]


Страницы:   1 2 3

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  всегда покажет правильный результат, только он тебе может не понравится.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо