Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вот такая тема ...... / 13 сообщений из 13, страница 1 из 1
29.07.2003, 15:22
    #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
29.07.2003, 16:06
    #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
29.07.2003, 18:03
    #32221344
Casper_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая тема ......
Странно.. Select top 1 * from job должно железно сработать.
Либо у тебя "веселая" база.
...
Рейтинг: 0 / 0
29.07.2003, 18:04
    #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
30.07.2003, 12:28
    #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
30.07.2003, 14:20
    #32222345
©Felix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая тема ......
что у тебя за база?? формат???

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

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

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

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

совет... возьми какой нить скул менеджер зайди в сою базу и выполни запрос с ТОР, если не выйдет значить твоя СУБД не поддерживает данный оператор в запросе, ищи в документации....
...
Рейтинг: 0 / 0
30.07.2003, 17:40
    #32222826
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая тема ......
А что значить взять первую запись ... ??? первую попавшуюся ???
Если есть какой то критерий например макс ид или что то в этом роде,
то сосавь нормальное where - выражение (фильтр) по этому критерию ...
помоему так ...
...
Рейтинг: 0 / 0
31.07.2003, 07:53
    #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
31.07.2003, 14:36
    #32223854
dasistgut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая тема ......
Может быть дело в том, что применяется локальная БД. Попробуй выполнить такой TQuery например на Access через ODBC. Вообще TTable при открытии (TTable открывается функцией DbiOpenTable) перечитывает все записи, а TQuery (открывается функцией DbiQExec) читает только то количество записей, которое определяется по-видимому внутренним буфером BDE. Поэтому скорость открытия TQuery не зависит от общего количества записей по данному условию, а TTable зависит. Может быть то, что в твоём случае выбирабются все записи, как я сказал ранее, зависит от локальной СУБД.
...
Рейтинг: 0 / 0
01.08.2003, 09:35
    #32224593
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот такая тема ......
Так, начнем по-порядку
Код: plaintext
Open(). Т.е. типа того что он делает FetchAll()

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

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

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

SELECT TOP 100 * FROM job

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

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

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

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

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


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