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 поймать этот глюк так и не получилось.


Delphi2020   (2009-10-21 10:51:00) [1]

Все. Вроде бы разобрался полностью:

После проверок получилась такая штука (1-показывает число строквсе правильно, -1 - показывает -1):

            ctDynamic   ctKeyset   ctOpenForwardOnly   ctStatic   ctUnspecified
clUseClient      1           1             1                1          1
clUseServer      0           1             0                1          0


В итоге получаются два вывода:
1. используя настройки по умолчанию (clClient и ctKeySet) RecordCount показывается правильно.
2. IsEmpty показывается правильно всегда, даже когда RecordCount=-1

Если кто-то в чем-то не согласен - дописывайте.


Delphi2020   (2009-10-21 10:09:00) [2]

> RecordCount=-1 нормальное состояние, которое не о чем ни
> говорит.

Ясно. Для некоторых курсоров это просто необходимо, т.к. RecordCount узнать они не в состоянии.

Ну если оставить тип курсора по умолчанию: KyrsorType=ctKeyset то RecordCount и IsEmptyвсегда будет показывать то, что надо?

Судя по этому:
> A keyset cursor also knows how many records are in the result
> set, because it has to retrieve a fixed set of keys when
> the result set is opened, so it also returns a useful value
> for RecordCount.
вроде бы да (отдельное спасибо qwer_qwer), хотя, уча английский, я с ним все еще не в ладах.


Delphi2020   (2009-10-21 10:06:00) [3]

Удалено модератором


qwer_qwer   (2009-10-21 09:54:00) [4]


> Германн ©   (21.10.09 01:50) [28]
>Это и было сказано в:> palva ©   (20.10.09 21:
> 37) [17]


Да неужто?


Anatoly Podgoretsky   (2009-10-21 09:53:00) [5]

> Delphi2020  (21.10.2009 09:43:37)  [37]

RecordCount=-1 нормальное состояние, которое не о чем ни говорит.


Delphi2020   (2009-10-21 09:43:00) [6]

Ну почему же. Не пофигу. Я читаю и строю для себя выводы. Вот IsEmpty я никогда раньше не использовал. Теперь хотелось бы найти общий способ, позволяющий узнать, можно использовать RecordCount или нет. Например, если нужно изменить размеры формы, так, чтобы влезали все строки и др.

Пока буду использовать в таких целях RecordCount=-1 после Open (такое решение тоже посоветовали на этом форуме). Что касается типа курсора - для разных программ и даже запросов он может быть разный.

Всем большое спасибо.

Буду рад, если кто-нибудь еще чего посоветует.


Anatoly Podgoretsky   (2009-10-21 09:28:00) [7]

> Delphi2020  (21.10.2009 09:01:33)  [33]

Старались, старались, а все обсуждение пофигу.


Delphi2020   (2009-10-21 09:12:00) [8]

Кде-то это число может вывестись на экран пользователю. Где-то при Next не обработаются оставшееся записи (хотя последнее можно избежать, переведя циклы for в while), да и вообще, если узнавать - пустая ли база через RecordCount, можно получить -1 а не 0. Вот я и подумал, что проверка RecordCount=-1 в [31] может быть панацеей от всех этих случаев и гарантировать нормальные показания в RecordCount. И решил спросить - так это или не так.


Sergey13   (2009-10-21 09:05:00) [9]

> [33] Delphi2020   (21.10.09 09:01)
> сколько строк имеется в базе под мой запрос.

И что изменится если там не 34 записи, а 86 например?


Delphi2020   (2009-10-21 09:01:00) [10]

Титанических усилий не будет, т.к. в моей программе все запросы выведены в отдельную функцию, внутри которой производится open. Там я и намереваюсь добавить проверка RecordCount=-1.
RecordCount нужет, т.к. иногда нужно узнать - сколько строк имеется в базе под мой запрос.


Sergey13   (2009-10-21 08:52:00) [11]

> [31] Delphi2020   (21.10.09 08:33)
> То в коде после этой проверки можно будет полагаться на
> RecordCount как на точное кол-во строк?

А для чего тебе нужно полагаться на RecordCount? И полагать на это титанические усилия?


Delphi2020   (2009-10-21 08:33:00) [12]

Если кто-то знает ответ на мой вопрос про ExecSQL - пожалуйста, ответьте. Может быть это просто, но после RecordCount я уже не знаю, на что из возврата ADO можно положиться. В справке, вроде бы, никаких исключений нет.

И еще один вопрос: верно ли, что если я напишу:
 
 ADOQ.SQL.Clearl
 ADOQ.SQL.Add('SELECT.......
 try
   ADOQ.SQL.Open;
 exception
   ...
 end;
 if ADOQ.RecordCount=-1 then
 Begin
   Message...
   abort;
 end;
 
То в коде после этой проверки можно будет полагаться на RecordCount как на точное кол-во строк? (именно строк в полной выборке, которую я и ожидал получить)


Delphi2020   (2009-10-21 07:04:00) [13]


> пустой набор - это когда IsEmpty = true ;)

Спасибо  - вот, собственно, и ответ на мой вопрос про определения того, пустая выборка или нет.
И еще небольшой вопрос: ExecSQL возвращают полное количество строк или тоже может подойти к проблеме подсчета обработанных строк 'творчески'?


Игорь Шевченко   (2009-10-21 01:51:00) [14]

Вот же напридумывали разных курсоров.

По моему (нескромному) мнению - не стоит опираться на свойство RecordCount (а тем более, выдавать SELECT COUNT(..) FROM (..) в многопользовательском режиме для того, чтобы узнать, сколько записей), потому что оно ведет к неоправданым издержкам при работе с нефайловой базой данных - довольно редко имеет смысл сразу после открытия курсора тащить весь результат на клиента.


Германн   (2009-10-21 01:50:00) [15]


> qwer_qwer   (21.10.09 01:38) [27]
>
> Вот более подробное описание:
>

Это и было сказано в:

> palva ©   (20.10.09 21:37) [17]


qwer_qwer   (2009-10-21 01:38:00) [16]

Вот более подробное описание:

ADO datasets sometimes return –1 for their RecordCount.

A forward-only cursor cannot know how many recordsare in the result set until it reaches the end, so it returns –1 for the RecordCount.
A static cursor always knows how many recordsare in the result set, because it reads the entire set when it is opened, so it returns the number of records in its result set.
A keyset cursor also knows how many recordsare in the result set, because it has to retrieve a fixed set of keys when the result set is opened, so it also returns a useful value for RecordCount.
A dynamic cursor does not reliably know how many recordsare in the result set, because it is regularly rereading the set of keys, so it returns –1. You can avoid using RecordCount altogether and execute SELECT COUNT(*) FROM tablename, but the result will be an accurate reflection of the number of records in the database table—which is not necessarily the same as the number of records in the dataset.


qwer_qwer   (2009-10-21 01:19:00) [17]

Во всех остальных случаях RecordCount будет работать как надо.


qwer_qwer   (2009-10-21 01:18:00) [18]

А, всё понятно.

Похоже, что RecordCount не будет работат ь в единственном случае - когда
ADODataSet.CursorType=ctDynamic, потому что в этом случае RecordCount просто не имеет смысла:
ctDynamic: Dynamic cursor; data modifications, deletions, and insertions by other users are visible; scrolling forward and back allowed.


qwer_qwer   (2009-10-21 01:14:00) [19]


> Везение. И малый круг решаемых задач.


Возможно.
Просто из справки непонятно, в каком случае Should ADO not be able to determine that actual number of rows


Германн   (2009-10-21 01:06:00) [20]


> qwer_qwer   (21.10.09 00:52) [21]
>
>
> > Плохиш ©   (20.10.09 23:08) [18]
> > Странно, у меня всегда он равен -1
> > и это не ошибка.А пустой набор данных это, когда, сразу
> > после открытия, eof = true.
>
>
> У меня TADOQuery возвращает нормальное значение почему-то.
> ..
>

Везение. И малый круг решаемых задач.


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

Наверх

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