Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.01.24;
Скачать: [xml.tar.bz2];

Вниз

Почему не правильно работает RecordCount?   Найти похожие ветки 

 
Dim   (2001-12-17 11:57) [0]

Доброго всем здоровья.
В чем проблема, почему в InterBase"е в RecordCount неверные значения. Мне один программист говорил, что это не лечится, но что-то не очень в это верится. Подозреваю что в Borlande работают серьезные ребята, и не незаметить такую лажу просто невозможно.
Какие будут мнения.


 
kserg@ukr.net   (2001-12-17 12:28) [1]

Это не ответ, а в плане уточнения: в каких случаях RecordCount выдает неверные значения?
Сколько работаю никогда такого не замечал


 
Boo   (2001-12-17 13:19) [2]

Согласен с последним возражением...
Я знаю только один подобный случай: BDE при работе с MSSQL через ODBC драйвер 3.70.08.20 всегда выдает RecordCount=-1


 
asafr   (2001-12-17 13:26) [3]

Используй COUNT(*) в SQL. Никаких проблем.


 
Alexandr   (2001-12-17 14:00) [4]

RecordCount никаким образом с сервером не связан.
Он связан библиотекой доступа.
Через что ты работаешь с Interbase (BDE,FIBPlus,IBX,IBObjects или другое)?
P.S. для некоторых библиотек перед RecordCount надо писать FetchAll
некоторые библиотеки имеют 2 метода вычисления RecordCount-путем прямого пересчета всех записей на клиенте или путем вызова select count(*)
А как это неверные значения-можно подробнее...


 
Mick   (2001-12-17 14:06) [5]

Отсюда мораль: не используй RecordCount при работе с любым SQL сервером.
Самая малая неприятность которая при этом может случиться: - получите 0 или -1.
Но чаще всего получите FetchAll :(


 
Alexandr   (2001-12-17 14:17) [6]

1)не так плох FetchAll, как о нем пишут не знающие люди.
2)в FIBPlus есть возможность делать RecordCount без FetchAll- выполняя аналогичный запрос с select count(*)


 
Desdechado   (2001-12-17 20:59) [7]

RecordCount годится только для TTable на файл-сервер, для остального - это заглушка, которая может работать самым непредсказуемым образом


 
Dim   (2001-12-18 07:28) [8]

>kserg@ukr.net
with Query do begin
SQL.Add(select * from table);
Open;
Statusbar1.Panels.Items[1].Text := IntToStr(RecordCount);
end;(Причем этот же код в MSSQL 6.5 работает правильно)
---------------------------------------------------------------------
>asafr ©
Оно конечно так, но больно уж тормозит даже у меня на машине(300 МГц, 128Мб), а что будет у оператора (75 МГц 16Мб)
---------------------------------------------------------------------
>Alexandr ©
Попробовал поработать черех IBX. Неверные значения это, в списке 33 строки, а в Statusbar"е 22. Причем если строк не много 7,13 то все зашибись.


 
Alexandr   (2001-12-18 09:01) [9]

2Desdechado:Обоснуй
2Dim:Никто и не говорит, что тормозить не будет, особенно если выборка большая.А чтобы правильные значения были, FetchAll делал.
Count(*) быстрее будет чем Open+FetchAll+RecordCount
т.к. в первом случае подсчитывает сервер, пусть и не так оптимально как блокировочные сервера(Interbase версионник)
а во втором случае таблица загоняется целиком на клиента, и клиент подсчитывает количество записей.Достоиством здесь является то, что данные уже оказываются на клиенте.
Ведь попробуй после Open сделать Last - тоже тормозить будет если строк много в запросе-это данные с сервера на клиент передаются.А RecordCount после этого пройдет мгновенно...
Почему для Ttable это не так? при last Ttable не перечитывает весь запрос с сервера, а берет только конец таблицы и в случае Client-server Ttable ни в коем случае использовать не рекомендуется.
Вообщем выводы следующие.
при Clent-Server архитектуре не рекомендуется возвращать большие наборы данных- да и зачем- оператор их все равно все не прочитает. Нужно правильно формировать запрос к серверу, чтобы он возвращал только то, что нужно.
Тогда ни count(*) ни RecordCount на клиенте тормозить не будут



 
vinni2000   (2001-12-18 10:30) [10]

С проблемой Recordcount в Interbase я разобрался так.

Query1.Last;
r:=Query1.Recno; // Это и есть количество записей в указаной базе


 
dimsfdf   (2001-12-18 10:37) [11]

по моему RecordCount глючит когда запрос возвращает безразмерные поля (типа Memo, Blob ...) (DB2v6,D5)



 
belobadgo   (2001-12-18 11:49) [12]

Была у меня когда-то такая проблемма, не решил... Но позже вычитал , что для получения коректного значения RecordCount необходимо сходить на последнюю запись, а потом вернутся на первую... Но я не проверял.


 
Dim   (2001-12-18 11:49) [13]

>vinni2000
Классно, а главное быстро и правильно.:)))


 
Alexandr   (2001-12-18 12:25) [14]

а вот так неправильно?
Query1.Last;
r:=Query1.RecordCount; // Это и есть количество записей в указаной базе

или так

Query1.FetchAll;
r:=Query1.RecordCount; // Это и есть количество записей в указаной базе



 
Desdechado   (2001-12-19 17:18) [15]

2 Alexandr

Цитирую справку:

Use RecordCount with care, because record counting can be a costly operation, especially for SQL queries that return large result sets. Generally, an application should only use RecordCount with Paradox and dBASE tables.

This function is meant to get the number of records associated with the cursor. The count is approximate in some cases.


 
Alexandr   (2001-12-20 07:36) [16]

читал я это.
Ну и что?


 
Desdechado   (2001-12-20 11:02) [17]

The count is approximate in some cases = В некоторых случаях подсчет приблизительный

Какие именно эти "некоторые" случаи - неизвестно ...


 
Slava   (2001-12-20 11:30) [18]

Использовал и IBX и FIBPlus:
RecordCount ни разу не обманул :)
Естественно, если его прочитать после FetchAll...


 
Alexandr   (2001-12-20 11:54) [19]

2Desdechado: Во-во. И что значит "приблизительный" такого понятия в математической логике (да и программировании) нет (см. "женская логика").
2Slava:Вот и я о том же.


 
Владимир Шаламберидзе   (2001-12-20 12:37) [20]

RecordCount не определен для ВСЕХ SQL запросов будб то интербаиз или оракл
Вся проблема в том что при выражении типа select * from blabla происходит чтение первых N записей и программа не знает кол-во записей
Вариант с
Query.Last; Query.Recno
хорош только для небольших таблиц так как при этом происходит чтение ВСЕЙ таблицы. Я бы порекомендовал вариант

select count(*) from blabla и тд

для больших таблиц это даст ощутимый выигрыш в скорости


 
Alexandr   (2001-12-20 13:58) [21]

дык это тут уже обсудили.
Не надо повторяться


 
Alexandr   (2001-12-20 14:00) [22]

кстати рассмотри такой вариант:
все данные все-равно на клиенте нужны будут поэтому Last или fetchAll все равно делать- а после этой операции RecordCount вычисляется очень быстро.
так надо-ли в таком случае еще и на сервере count делать?



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.01.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.004 c
3-75463
night
2001-12-18 11:22
2002.01.24
Как сделать плавную проктрутку в DBGrid???


3-75535
sky3d
2001-12-21 18:24
2002.01.24
SQL запрос


14-75672
limon
2001-11-27 17:08
2002.01.24
Уделите 5 минут изучению русского языка...(фамилии)


3-75496
Kirill
2001-12-18 17:32
2002.01.24
ADO и новая запись


3-75485
Dick Gonsales
2001-12-14 05:47
2002.01.24
Хранение временных данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский