Сколько строк в выборке select?

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Закрыто
Sanya111
Сообщения: 26
Зарегистрирован: Пн 02 июл 2012 14:07

Сколько строк в выборке select?

Сообщение Sanya111 » Пт 01 фев 2013 07:27

Добрый день.
Пользуюсь вашими компонентами, но я не программист, поэтому приходится учиться самому.
Подскажите, пожалуйста, как узнать сколько строк в выборке после запроса select?
Раньше просто считал сколько строк в цикле. Но можно как-то еще узнать?
В справочниках нашел описание функции count,например,
SELECT id, COUNT(*) FROM ice_cream GROUP BY id.
Но как это использовать в моем коде я к сожалению не могу понять.

Код: Выделить всё

Form1.MyQuery1.SQL.Text:= 'select * from rd where name_id=:dname';
Form1.MyQuery1.ParamByName('dname').AsString := Pr1NameForDB[0,i1];
Form1.MyQuery1.Open;
while not Form1.MyQuery1.Eof do begin
i:=i+1; {считаем сколько строк}
StrokaPrMogForDB:=Form1.MyQuery1.FieldByName('prM_id').AsString;
Form1.MyQuery1.Next;
end;
Form1.MyQuery1.Close;

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: Сколько строк в выборке select?

Сообщение DemetrionQ » Пт 01 фев 2013 18:18

Здравствуйте.

Количество строк в выборке select можно узнать 2мя способами.

1)

Код: Выделить всё

Form1.MyQuery1.SQL.Text:= 'select * from rd where name_id=:dname';
Form1.MyQuery1.ParamByName('dname').AsString := Pr1NameForDB[0,i1];
Form1.MyQuery1.Open;
i:=Form1.MyQuery1.RecordCount; // свойство RecordCount хранит число загруженных строк
2)

Код: Выделить всё

Form1.MyQuery1.SQL.Text:= 'select count(*) from rd where name_id=:dname';
Form1.MyQuery1.ParamByName('dname').AsString := Pr1NameForDB[0,i1];
Form1.MyQuery1.Open;
//SQL запрос возвратит число строк из таблицы rd отвечающих условию name_id=:dname
i:=Form1.MyQuery1.FieldByName('count(*)').AsInteger; //сохраним число строк

//теперь загрузим сами строки таблицы для дальнейшей работы с ними
Form1.MyQuery1.SQL.Text:= 'select * from rd where name_id=:dname';
Form1.MyQuery1.ParamByName('dname').AsString := Pr1NameForDB[0,i1];
Form1.MyQuery1.Open;
Учтите, что при работе со свойством RecordCount есть одна особенность. RecordCount хранит число строк, которое реально загрузил (закешировал) TMyQuery компонент из базы.

У компонента TMyQuery (а так же и у TMyTable) есть свойство FetchAll , по умолчанию оно установлено в True и это значит что будут загружаться сразу все записи из таблицы. В этом случае RecordCount соответствует реальному количеству записей в таблице БД.

Если FetchAll установлен в False то при открытии TMyQuery загрузятся не все записи. Число записей, которое будет загружено сразу после открытия ограничится числом указанным в свойстве FetchRows. При дальнейшей работе с TMyQuery (используя методы Next , Last) записи будут подгружаться по мере необходимости и число RecordCount будет увеличиваться. А метод Last вынудит TMyQuery подгрузить все записи из таблицы БД, если они ещё не были загружены.
Последний раз редактировалось DemetrionQ Пн 04 фев 2013 17:30, всего редактировалось 1 раз.

Sanya111
Сообщения: 26
Зарегистрирован: Пн 02 июл 2012 14:07

Re: Сколько строк в выборке select?

Сообщение Sanya111 » Сб 02 фев 2013 09:37

Спасибо огромное Вам за помощь, примеры и за подробные комментарии!
Теперь все понятно!! :)

Закрыто