Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Как можно получить кол-во строк рез-та запроса?


Автор: lifer 7.11.2004, 12:41
У меня в программе есть компонент query, datasourse и несколько dbEdit. Как мне узнать сколько строк рез-та возвращается после выполнения query?

P.S. Это моя превая программа с использованием БД на Делфи, раньше работал с MySQL+PHP. Там все с этим понятно, а тут пока что не очень smile .
Помогите пожалуйста.

Автор: Pakshin A. S. 7.11.2004, 14:33
Код

Select Field1, Field2, Count(*) From Table1 where Field1 = Something


Функция count возвращает количество строк (записей) в наборе данных...

Вроде так.

Автор: Vit 7.11.2004, 16:36
Pakshin A. S. - нет так нельзя!

Query.recordcount - это количество строк

Автор: lifer 7.11.2004, 19:57
Спасибо большое.
Еще вопрос:
У меня в программе есть компонент query1 через который я осуществляю поиск по БД. Мне необходимо после нахождения результата отредактиовать данные, но я не могу этого сделать т.к. выскакивает ошибка "Cannot edit a read-only dataset." В чем ошибка?

Автор: Medved 7.11.2004, 23:17
Набор данных, возвращаемый копонентом TQuery, являющийся результатом запроса, редактировать можно, но при определенный услових. Кроме того - я Вам не рекомендую так делать. Это очень плохой стиль. Вы сам потом будуте не рады, что так сделали.

А подробное описание того, как редактировать данные в запросах, я уже давал раньше, сделайте поиск по форуму.

Модератор: Один топик - ОДИН вопрос.

Автор: Vit 8.11.2004, 04:24
Цитата(lifer @ 7.11.2004, 10:57)
У меня в программе есть компонент query1 через который я осуществляю поиск по БД. Мне необходимо после нахождения результата отредактиовать данные, но я не могу этого сделать т.к. выскакивает ошибка "Cannot edit a read-only dataset." В чем ошибка?



В 17й строке запроса... Код запроса в студию!

Автор: lifer 8.11.2004, 11:57
Прочитав статью "БД с нуля" стал исользовать Table1.Locate. ТОлько остался один вопрос: Locate находит первую запись, удовлетворящую условию. А если у меня в таблице есть две записи с одинаковым значением искомого поля как мне перейти ко второй записи?

Автор: Medved 8.11.2004, 12:36
Я могу конечно подсказать Вам ответ, ибо поиск осуществляется не только методом Locate.

Но лучше порекомендую http://xammepbook.narod.ru/doc/delph/delphi3bd.rar вот эту книжку Шумакова. В ней вы найдете все вопросы, которые у Вас могут возникнуть при работе с БД на начальном этапе. Написана доступным языком.

Автор: Vit 8.11.2004, 15:41
Locate - самый простой метод и используется только для одной записи.

Используйте SQL запрос.


Цитата(lifer @ 8.11.2004, 02:57)
Прочитав статью "БД с нуля" стал исользовать Table1.Locate



Если бы прочитали до конца и внимательно то использовали бы SQL как значительно более мощное средство

Автор: Нурадин 13.12.2004, 14:52
Подсоединяюсь ч/з ADOconnection - курсор серверный, ADOQuery - серверный курсор, тип динамический, добавляю DBGrid, выходит ошибка Dataset does not support bookmarks? which are required for multi-record data controls
В чем причина, спасибо заранее

Автор: Vit 13.12.2004, 16:52
А какой SQL?

Автор: Kurt 14.12.2004, 04:02
Цитата(Vit)
Query.recordcount - это количество строк

Нет так давно мой знакомый потерял кучу времени именно из-за этого свойства.
Как оказалось, у этого самого TQuery есть глюк - после выполнения запроса в RecordCount далеко не всегда содержится количество записей - часто там какое-то левое число.
Помогает только вызов FetchAll() перед использование св-ва RecordCount.
Кто-нибудь встречался с подобным? В чем причина?

Автор: Нурадин 14.12.2004, 05:59
MSSQL2000

Автор: Vit 14.12.2004, 17:54
Цитата(Kurt @ 13.12.2004, 19:02)
Нет так давно мой знакомый потерял кучу времени именно из-за этого свойства.
Как оказалось, у этого самого TQuery есть глюк - после выполнения запроса в RecordCount далеко не всегда содержится количество записей - часто там какое-то левое число.
Помогает только вызов FetchAll() перед использование св-ва RecordCount.
Кто-нибудь встречался с подобным? В чем причина?



Объясню причину. Дело в том что клиент серверные технологии предусматривают передачу данных через сетку только по требованию, некими кусками. Фактически результат запроса это поток, который некими кусками перекачивается с сервера на клиент. Если вы выполняете например

Select * From Table

То вовсе не все данные перекачиваются на клиента, пререкачивается блок (обычно примерно 64 Kb, но зависит от настроек провайдера базы данных) там где находится курсор данных, если выборка меньше 64 Kb - то recordcount вернёт правильное значение, если нет то какое-то средне-потолочное. Для ADO обычно помогает следующий приём который я всем настоятельно рекомендую использовать:

AdoQuery1.open;
AdoQuery1.Last;
AdoQuery1.First;
AdoQuery1.recordcount

Именно выделенная строчка гарантирует правильность значения AdoQuery1.recordcount!

Хуже дело обстоит с однонаправленными курсорами данных, там нет никакой возможности узнать количество записей без прохода до конца данных, а проход в обратную сторону невозможен... Увы это ограничение технологии, которое невозможно обойти

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)