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

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

Как подбить количество возращаемых записей? [D5, IB5.x]


YuraKiller ©   (2003-05-25 15:38:00) 

Мне нужно узнать количество записей результатирующего набора.
Как это можно красиво сделать?

Запрос например: select * from main where type=10 and code>100

Как это можно сделать не посылая : select count(*) from main where type=10 and code>100ещё раз.

Может есть какое-то свойство или оператор?...


Danilka   (2003-05-28 08:00:00) [1]

Proton © (28.05.03 07:55)
Ладно, признаюсь, с моей стороны все посты в этой ветке - просто флуд, сначала на:
Verg © (27.05.03 08:46)
на то утверждение, что если одна транзакция меняет данные, то транзакция стартовавшая раньше их не видит, я начал флудить что в могопользовательских БД всегда есть вероятность того, что данные устарели.

Можно их смело прибить.


Proton   (2003-05-28 07:55:00) [2]

Наверное в данном случае пользователя устроит "приблизительное" количеество записей. А если он будет выводить данные то он всегда сможе использовать recordcount.


YuraKiller   (2003-05-28 00:50:00) [3]

Да.., ну Вы и бадягу замесили.. :-))


Orlan Master   (2003-05-27 13:41:00) [4]

На всякий случай: именно там, где есть транзакции, можно с уверенностью сказать, сколько записей было на момент транзакции. Просто операцию по расчету кол-ва записей необходимо производить ВНУТРИ ОДНОЙ И ТОЙ ЖЕ ТРАНЗАКЦИИ, а уровень изоляции не должен быть DirtyRead (ReadUncommited). Для MSSQL, например, если выборка делается из хранимки, то можно кол-во записей впендюрить в переменную, и ее значение считать непосредственно из переменной. Иными словами, из хранимки можно одновременно получить и селектовую выборку и значения возвращаемых переменных.
М.б. в IB есть нечто похожее.


Danilka   (2003-05-27 09:19:00) [5]

Alexandr © (27.05.03 09:01)
Ладно, разжую, там где есть транзакции, невозможно на 100% с уверенностью сказать, сколько реально записей в таблице в данный момент.
Конечно, таблицы и задачи, в которых идет вставка новых записей несколько штук в секунду очень-очень редки, и в любом случае, для них нет необходимости смотреть кол-во записей.
В то-же время, при наличии даже двух пользователей есть какая-то вероятность, что количество, например, счетов-фактур через секунду будет на 1 больше, чем только-что показал count(*)

Да и там где транзакций нет, тоже нельзя с 100% уверенностью сказать что секунду назад сделаное count(*) - правильное. :))


Danilka   (2003-05-27 09:11:00) [6]

Alexandr © (27.05.03 09:01)
тема ветки, вообще-то IB5.x
к тому-же, похоже, даже смайлики не на всех действуют :))


Verg   (2003-05-27 09:06:00) [7]


> Alexandr © (27.05.03 09:01)


Мне-то чего хочется?

Вопрос по-моему "простой" - где берут RowsAffected в IB?


Alexandr   (2003-05-27 09:01:00) [8]

2Verg © если очень хочется, сделай repeatableRead транзакцию.

2Danilka © DBF? Paradox? Все что вы пишите есть бред сивой кобылы.


Danilka   (2003-05-27 08:54:00) [9]

Verg © (27.05.03 08:46)
угу, и для "обьективной реальности" остается только уйти нафиг с IB на сервак поддерживающий транзакции Dirty Read, и на нем уже делать count(*)
;))


Verg   (2003-05-27 08:46:00) [10]

Если транзакция readcommited,


select * from main where type=10 and code>100


... а здесь в другой транзакции в main были добавлены/удалены записи удовлетворяющие условию и сделан commit, то


select count(*) from
main where type=10 and code>100 ещё раз.


...будет ли результат второго запроса равен колечеству выбранных записей в первом?


YuraKiller   (2003-05-27 01:33:00) [11]

Пасибо!


DrPass   (2003-05-25 21:44:00) [12]

select count(*) - это и есть самый красивый и разумный вариант


Sergey Masloff   (2003-05-25 20:17:00) [13]

>Как это можно сделать не посылая : select count(*) from main >where type=10 and code>100 ещё раз.
Все остальные способы приводят к фетчу ВСЕХ записей на клиента. Так что хорошо подумай, может стоит сделать select count(*) и узнать что там таких записей полтора миллиона или узнать об этом же после получаса ожидания пока они тебе на клиента приползут?


Engel   (2003-05-25 15:41:00) [14]

query.recordcount


Наверх

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