powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вот такая тема ......
13 сообщений из 13, страница 1 из 1
Вот такая тема ......
    #32220989
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мужики вот такой вопрос.

Делаю новый проект в C++Builder 5.0 (можно и в Делфях).
Ложу на форму комп. Tquery.

"
Query->SQL->Clear();
Query->SQL->Add("select * from job");
Query->Open();
Query->Close();
" - это реакция на кнопку...

Можно как-нить сделать так чтоб он не выбирал все в память когда делаешь Open(). Т.е. типа того что он делает FetchAll() когда запускаешь Query...
а мне этого не надо. Надо только первую запись !!!!!!!!!!!!!

Select first ...
Select top ...
не предлагать ... :) не работает ...
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32221083
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже собрал вот такие варианты-предложения:
Код: plaintext
1.
2.
3.
4.
select * from job where recno() <  2 
select first  1  * from job
select top  1  * from job
select * from job where rownum <  2 

BDE не признает все это под разными предлогами ... :(((
Кто еще ?
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32221344
Casper_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно.. Select top 1 * from job должно железно сработать.
Либо у тебя "веселая" база.
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32221346
MrAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй сделать Query->CachedUpdates = false...

TBDEDataSet от которого наследуется TQuery. Help on FetchAll

Call FetchAll to reduce network traffic when using cached updates. FetchAll calls CheckBrowseMode to post any pending changes, and then retrieves all records from the current cursor position to the end of the file, and store them locally.

Ordinarily when CACHED UPDATES ARE ENABLED, A TRANSACTION RETRIEVES ONLY AS MUCH DATA AS IT NEEDS FOR DISPLAY PURPOSES. Each new fetch starts a new, read-only transaction. To consolidate transactions and reduce network traffic, an application can call FetchAll to retrieve all data in a single transaction.

Хотя CachedUpdates по умолчанию и так равен false...
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32222088
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Casper_

" Странно.. Select top 1 * from job должно железно сработать.
Либо у тебя "веселая" база. "


Наверное странно. Ты не первый мне это предлагаешь - но ничего не работает. Может у меня версия BDE не та. Вообще от версии это может зависить. Еще странней что в описании SQL в файле "C:\Program Files\BDE\localsql.hlp" ни про "Top" ни про "First" нет ничего. Вот.


To: MrAlex

Попробуй сделать Query->CachedUpdates = false...
.......
Хотя CachedUpdates по умолчанию и так равен false...


CachedUpdates действительно стоит по умолчанию... и ни черта не помогает.
Вот делаю простой проект с одной формой и одним Tquery
"select * from таблица" я пробовал на табл. с 250.000 записей. Положил даже на ворму два Label'а которые показывали время Начала и Конца. Запуск с любыми параметрами Query давал около 2 с половиной минут .на Celeron 1200 . Вот так и никакой надежды получить просто первый N записей.
:(((
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32222345
Фотография ©Felix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что у тебя за база?? формат???

и структуру таблицы???? покажи плиз...
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32222550
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что у тебя за база?? формат???
и структуру таблицы???? покажи плиз...

To Felix
Как тебе ее показать ?!

Файл Paradox. Т.е. табл. с двумя полями (int)(VarChar) Все . . .
Да эта проблема с любыми базами . . .
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32222817
Фотография ©Felix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
структуру таблици, ет где какого типа поля и какие ключевые и все остальное... ладно примерное понятно...

я с парадоксом не работал там где я проверял все работает... но там не ТОР просто синтаксис СУБД другой...

совет... возьми какой нить скул менеджер зайди в сою базу и выполни запрос с ТОР, если не выйдет значить твоя СУБД не поддерживает данный оператор в запросе, ищи в документации....
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32222826
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что значить взять первую запись ... ??? первую попавшуюся ???
Если есть какой то критерий например макс ид или что то в этом роде,
то сосавь нормальное where - выражение (фильтр) по этому критерию ...
помоему так ...
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32223178
Максим (m-axic)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет Всем!
Спасибо всем за активность. Любую.

Описание задачи.
БД - BDE.
Файл - Job.DB. - Формат "Paradox".
Структура таблицы - Два поля Job_id(int), Name(Varchar), Date_work(Date)
(Структура не обсуждается - я ее на ходу придумал - рез-т и причины работы от нее не зависят)
Кол-во записей - около 250.000.

Есть проект на C++ Builder 5.0 (можно и Делфи - нет разницы) с одной формой. На форме также есть одна кнопка и ListBox, например, для вывода результата. (да и TQuery еще)
Что мне надо - надо чтоб по нажатию на кнопку Query выбирал по любому условию записи в ListBox.
Но так как записей в таблице достаточно много то сам процесс выборки всего займет очень много времени, да и не целесообразно это - 250000 строк в списке пользователю не надо. Т.е. задача усложняется надо выбрать например 100 первых записей, поместить их в ListBox и, например, когда пользователь дойдет до последней строки в ListBox у него выбирается следующая "партия" строк. Вот. Кончено, это было бы просто сделать через TTable - но этот вариант отпадает (по разным причинам).

Вот. И мой то вопрос заключается в том: как реализовать эту схему ?

Рассмотрим реакции на кнопку.

Вариант 1, когда выбираются Селектом все записи и в цикле пишутся первые 100 в ListBox.

Query->SQL->Clear();
Query->SQL->Add("select * from job");
Query->Open();
int i=0;
For (Query->First();!Query->EOF; Query->Next()) {
ListBox1->Items->Add(Query->FieldByName("name")->AsString);
i++;
if (i>100) break;
}
Query->Close();

p.s. Select можно с любым условием

Вы знаете сколько выполняется этот селект с 250000 записями? На Celeron 1200 около 2,5 мин.



Вариант 2, когда выбираются Селектом первые 100 записей и в цикле пишутся все выбранные в ListBox.

Query->SQL->Clear();
Query->SQL->Add("select top 100 * from job");
Query->Open();
For (Query->First();!Query->EOF; Query->Next()) {
ListBox1->Items->Add(Query->FieldByName("name")->AsString);
}
Query->Close();

p.s. Еще варианты Select'a, предложенные на форумах SQL.RU, которые у меня не работают:

"select top 100 * from job"
"select first 100 * from job"
"select * from job where recno() < 100"


Какие мысли?
P.s. надо же сколько с утра энергии .... стока на одном дыхании наПисать ;)
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32223854
dasistgut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть дело в том, что применяется локальная БД. Попробуй выполнить такой TQuery например на Access через ODBC. Вообще TTable при открытии (TTable открывается функцией DbiOpenTable) перечитывает все записи, а TQuery (открывается функцией DbiQExec) читает только то количество записей, которое определяется по-видимому внутренним буфером BDE. Поэтому скорость открытия TQuery не зависит от общего количества записей по данному условию, а TTable зависит. Может быть то, что в твоём случае выбирабются все записи, как я сказал ранее, зависит от локальной СУБД.
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32224593
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, начнем по-порядку
Код: plaintext
Open(). Т.е. типа того что он делает FetchAll()

Если ты пишешь Open() то само-собой получишь весь результат. Т.е никто его для тебя порциями с сервера отправлять не будет. Для решения есть несколько путей:
1 - серверные курсоры. С ними не работал поэтому могу ошибвать. Все ODBC и ADO свою работу с БД строят на концепции курсоров - будем считать что это что-то типа последовательности с операциями навигации ( типа Next() и т.д. ) Далее курсоры бывают разными, в частности клиентскими и серверными. В случае серверного курсора его управлением занимается сам сервер и храниться он на сервере по-этому вся выборка на клиента не попадает. У подхода есть минусы. Как я понял это Legacy и сейчас уже мало какие провайдеры данных его поддерживают
2 - постраничная выборка Как ее реализовать посмотри на форуме по MS SQL

IMHO Советую тебе при самом процессе пректирования учитывать что на запрос ты получает результат и если все записи тебе не нужны - тогда надо менять сам запрос
...
Рейтинг: 0 / 0
Вот такая тема ......
    #32226859
Фотография ©Felix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Максим (m-axic)

согласен... нужно через запрос...
я никак не пойму почему у тебя не работает

SELECT TOP 100 * FROM job

даже потратил 15 мин создал базу парадокса.... проверил, работает....

так вот... выбираешь постранично... как раелизовать переход смотри сам.. либо кнопки вперед назад... либо отслеживай позицию курсора в листбоксе.. и меняй запрос на выборку....
вариант на скорую руку: следить за курсором в лисбоксе... то есть на апдейт выбирать скажем по 10 записей верх и вниз от позиции..

НО... опять таки.. ТОР выберет что то вроде "верхние записи.." нужо ключевое поле ид... но ет как бы для варианта с постояннм нахождением в середине списка....

мдя... глянул так на свой вариант сам запутался....

мораль : выбирай запросом то что нужно.... ТОР работает!!!!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вот такая тема ......
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]