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

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

FireBird TIBQuery SELECT [D7, IB6.x]


DenKop ©   (2003-03-28 18:22:00) 

Вот такой интересный вопрос: имею TIBQuery

SQL[0] = SELECT * FROM TREE1 WHERE ID_PAR=0

TIBQuery.Open

Получаю RecordCount=1, а на самом деле записей 3.
Потом делаю TDataSource и связываю его с TIBQuery,
делаю DBGrid и связываю с TDataSource.

SQL[0] = SELECT * FROM TREE1 WHERE ID_PAR=0

TIBQuery.Open

Получаю RecordCount=3, что и хотелось получить, т.е. записи
выбираются только тогда, когда они отрабражаются в гриде?...
И ещё одна интересная вещь: в DesignTime настраиваю размер
грида под отображение без прокрутки ровно 2-х записей.
Выполняю свой запрос и получаю RecordCount=2, т.е. кол-во
записей равно кол-ву показываемых строк в гриде. Елси грида
нет, то Query выбирает стабильно одну, первую совпавшую запись.
Юзаю Firebird-1.0.2.908-Win32 с вин ХР.
Может кто сталкивался с такой вот геморойной вещью. Хотябы где
копать FIB, IDE, DUMP. Уже дня два парюсь с этим дерьмом.
И ещё когда этот запрос выполняю в консоли, всё проходит
замечательно, поэтому ищу концы в IDE, хотя может я и не прав.

Навсякий, DUMP таблички:

SET SQL DIALECT 3;
CREATE TABLE TREE1 (
ID INTEGER NOT NULL,
ID_PAR INTEGER NOT NULL,
TEXT VARCHAR(50) CHARACTER SET WIN1251 NOT NULL
);
ALTER TABLE TREE1 ADD CONSTRAINT FK_TREE1 PRIMARY KEY (ID, ID_PAR, TEXT);


zacho   (2003-03-29 05:31:00) [1]


> MsGuns © (29.03.03 01:30)
> Почитай внимательно все, что написано в хэлпе. В частности,
> если сервер не занят (типа локалки), то возвращает все сразу,
> если сервер занят обработкой других запросов, то вернуть
> он может только часть записей, оставляя "на потом" остаток.

Неправильно. Занатость/незанятостьтут вообще не причем. FetchAll всегдазакачивает всезаписи resultset"а

> DenKop © (28.03.03 23:45)

Почитай хелп по IBX (про FetchAll) и Language Reference про SELECT. Это будет и быстрее, и полезнее чем ждать ответов здесь


MsGuns   (2003-03-29 01:30:00) [2]

Почитай внимательно все, что написано в хэлпе. В частности, если сервер не занят (типа локалки), то возвращает все сразу, если сервер занят обработкой других запросов, то вернуть он может только часть записей, оставляя "на потом" остаток. Оставшиеся будут "подкачены (fetched) автоматически по мере обращения к ним приложения (смещение курсора к внеграничной метке НД в буфере)


DenKop   (2003-03-29 01:19:00) [3]


> Но "как бы" не всегда все...


А когда это бывает?


MsGuns   (2003-03-29 01:03:00) [4]

>DenKop © (28.03.03 23:45)

Она как бы подкачивает "все", что должно быть возвращеною Но "как бы" не всегда все...


DenKop   (2003-03-28 23:45:00) [5]

А чё это значит SELECT COUNT, выбрать колличество?
И что делает FetchAll


zacho   (2003-03-28 21:45:00) [6]


> MsGuns © (28.03.03 21:20)

Вместо Last-First проще использовать FetchAll :-)
А запрос с SELECT COUNT, действительно, в подавляющем большинстве случаев - оптимальнее.


MsGuns   (2003-03-28 21:20:00) [7]

Не верь глазам своим ! Лично я или делаю Last-First или отдельно параллетьный запрос с Select COUNT(*)


zacho   (2003-03-28 20:55:00) [8]

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


Mike Kouzmine   (2003-03-28 18:30:00) [9]

Может надо встать на поледнюю запись и только после этого смотреть RecordCount


Наверх

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