Форум: "Базы";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
ВнизПодкачка данных Найти похожие ветки
← →
Роман Антонов (2003-02-20 13:29) [0]MS SQL Server 2000, Delphi 6. Связь с базой данных
через ADO (MS OLE DB Provider for MS SQL Server).
Выполняется SELECT (TADOQuery) к таблицам.
Данные отображаются в DBGrid"е. Если SELECT возвращает очень
большое количество записей, то DBGrid получает фокус только тогда,
когда закачиваются все записи. А мне необходимо начать работу
с DBGrid"ом сразу же (просмотр первых закаченных записей и т.д.) и получать
количество закаченных записей (как в Enterprise Manager).
Пожалуйста, помогите!
← →
sniknik (2003-02-20 13:35) [1]попробуй открыть с параметром
ADODataSet.ExecuteOptions = [eoAsyncFetch]
← →
Роман Антонов (2003-02-20 14:19) [2]Установил ADODataSet.ExecuteOptions = [eoAsyncFetch], результат тот же. Может надо изменить CursorLocation и CursorType? И какое событие ADODataSet выдает количество закаченных записей?
← →
sniknik (2003-02-20 14:30) [3]логично было бы OnFetchProgress, его и смотри.
насчет "результат тот же", попробуй поменяй чегонибудь но в хелпе никакие зависимости не указаны.
← →
Роман Антонов (2003-02-20 16:06) [4]sniknik, спасибо за помощь.
Эта проблема стоит передо мной уже давно, но, к сожалению, никак не решается (может, руки не оттуда растут). Находил решения через TRecordSet, но тогда, похоже, вместо TDBGrid надо использовать что-то другое или писать свое :(. Вот такие дела.
← →
Anatoly Podgoretsky (2003-02-20 16:13) [5]Именно эти влияют CursorLocation и CursorType, поэкспериментируй
← →
sniknik (2003-02-20 16:20) [6]не получилось? давай по порядку
(переписываю свои параметры)
DBGrid = стандартный
ADOConnection.CursorLocation = clUseServer
ADODataSet.CursorLocation = clUseClient
ADODataSet.CursorType = ctKeyset
ADODataSet.CacheSize = 10
ADODataSet.ExecuteOptions = [eoAsyncFetc]
на событиях onFetchProgress и onFetchComplete
procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
Label1.Caption:= IntToStr(MaxProgress);
Application.ProcessMessages; //не знаю зачем стоит и без него работает но в примере хелпа стоит
end;
procedure TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
begin
Label1.Caption:= IntToStr(DataSet.RecordCount);
end;
попробуй должны циферки бегать (у меня бегают).
← →
Роман Антонов (2003-02-21 11:52) [7]К сожалению, не бегают. 1Млн записей. После продолжительной работы выдает "Out of memory".
← →
Роман Антонов (2003-02-21 12:06) [8]Забегали!. Просто сделал DBGrid.DataSource:=Nil; Похоже, проблемы с DBGrid"ом. Но как теперь отобразить данные на экране?
← →
sniknik (2003-02-21 12:20) [9]уверен что он у тебя стандартный? у меня с гридом никогда проблем не было (хотя вру один раз были, но уж очень экзотический случай). А с твоим "Out of memory" можно подумать что твой грид типа "EhGreed?" или что там подобное вкачивает рекордсет в себя наподобие СтрингГрида.
хотя с милионом записей не сталкивался (нафига столько сразу вкачивать?), но это неважно первая порция должна отобразится моментально.
попробуй положи новый грид с палитры и никаких изменений в настройках по умолчанию не делай (ну кроме DataSource конечно).
← →
sniknik (2003-02-21 12:33) [10]попробовал с запросом на полную таблицу 2097920 записи, в общем как и ожидалось от размера не зависит (работает и так).
← →
Роман Антонов (2003-02-21 12:41) [11]DBGrid стандартный. С "Out of memory" тоже понятно.
Количество закаченных записей отображает нормально. Но как только кликаю на DBGrid, происходит следующее:
1. цифры уже не бегут
2. в DBGrid"е отображаются наименования колонок (до этого ничего не было) и отображается разлиновка (вертикальная и горизонтальная по всей площади DBGrid"а). Ячейки пустые. Все тормозится, пока не закачаются все записи, после чего DBGird их нормально отображает.
← →
sniknik (2003-02-21 12:53) [12]Вот это и странно, глюк грида какой?. Такой вопрос, апдейты дельфям делал? Нет, проапдейть и попробуй еще раз тоже самое.
ftp://ftpd.borland.com/devsupport/delphi/d6/
← →
Роман Антонов (2003-02-21 12:55) [13]К Delphi6 сделан уже второй upgrade.
← →
Роман Антонов (2003-02-21 12:57) [14]И еще. Пробовал на двух машинах - результат тот же.
← →
Роман Антонов (2003-02-21 13:00) [15]Работаю через "MS OLE DB Provider for MS SQL Server". Это правильно?
← →
sniknik (2003-02-21 13:18) [16]да вроде и я через него, а что есть другие? :-)).
а Mdac какой стоит? (хотя при чем тут он до грида у тебя же работает) но на всякий случай у меня 2.7.
>К Delphi6 сделан уже второй upgrade.
у меня 4, 2 upd + 2 rtl.
← →
Роман Антонов (2003-02-21 13:22) [17]Сделал TDataSource.AutoEdit:=False. Затем TADOQuery.Open. Забегали цифры. DBGrid пустой. Раздвигаю вправо единственную колонку DBGrid"а. Колонка стала шире, появились наименования колонок и данные. Цифры еще бегут. Кликаю на какую либо ячейку DBGrid"а (все ячейки уже заполнены данными). Цифры не бегут. DBGrid становится активным только после того, как закачаются все записи.
Никакие свойства компонент больше не менял. Все строго по твоему примеру.
← →
Роман Антонов (2003-02-21 13:24) [18]Пока попробую скачать и поставить следующий update.
← →
sniknik (2003-02-21 14:24) [19]пока тут суть да дело я примерчик написал, буквально из 5 компонент. если хочеш зашлю. архив с exe 305kb ,могу и без екзешника но вдруг в компиляторе дело?, (не верю я в это но вдруг) с exe проше разобратся будет.
>Затем TADOQuery.Open
>Все строго по твоему примеру.
не строго, я квери не использую и тебе не советовал, у меня датасет.
← →
Роман Антонов (2003-02-21 15:16) [20]roman@data-izh.udm.ru
Буду очень признателен.
← →
sniknik (2003-02-21 15:31) [21]послал. только в ответ на тот ящик не посылай если будеш (в предверии выходных, не отвечу) возьми ящик с форума.
← →
Hawk2 (2003-02-21 15:47) [22]Извините что вмешиваюсь, но как-то была такая тема о тормозах при открытии таблиц и там говорили, если при работе с базой пользователю выводится больше чем 100 записей, то это неправильная организация работы, так как человек не может анализировать большие наборы информации (если речь идет об анализе), в других случаях вообще нет смысла выдавать пользователю по милиону записей :). Может стоит задуматься о разбивке выводимых данных на блоки (ну там по дате, по отделу или еще как, смотря какая база).
← →
Роман Антонов (2003-02-21 15:57) [23]Поставил RTL апдэйты. MDAC v.2.7. Вместо TADOQuery использовал TADODataSet. Результат тотже.
← →
Роман Антонов (2003-02-21 16:05) [24]Hawk2, Интерфейc программы должен позволять делать пользователю любые выборки из базы данных (по крайнер мере, в моем случае), хотя то, что ты пишешь, тоже правильно. Все зависит от поставленной задачи.
← →
sniknik (2003-02-21 16:16) [25]пример дошол? там как?
← →
sniknik (2003-02-21 16:18) [26]to Hawk2 (21.02.03 15:47)
вопрос не в том имеет это смысл или нет (я тоже сомневался) см. sniknik © (21.02.03 12:20) а в том почему не работает хотя в методах есть и должно.
а смысл можно "прикрутить", к примеру систама обработки/переноса данных 3 прогресса 1-идет закачка, 2-обработка, 3-сохранение данных(может быть в другую базу). Юзер вилит процес и доволен, не будет видеть, будет жать куда не попадя, и все сломает.
← →
Роман Антонов (2003-02-21 16:19) [27]Пока нет. Жду. Но смотреть буду скорее всего завтра.
Большое спасибо. О результатах сообщу.
С наступающим праздником!
← →
Andrey_Sobol (2003-02-21 22:25) [28]Мужики, глупостью занимаетесь, не предназначены ADOTable компоненты для работы с таким количеством записей. Делайте запросы к серверу, а не 1млн. записей перекачивайте. Серверу, что больше делать не чего? Возьмите TADOQuery и напишите селект.
← →
sniknik (2003-02-21 22:55) [29]2 Andrey_Sobol (21.02.03 22:25)
Ты читать умееш?
Где ты видел слово Table в обсуждении? не считая конечно твоего поста.
← →
Роман Антонов (2003-02-28 12:21) [30]sniknik, все ОК!
Огромное спасибо!!!
← →
Димон1 (2003-02-28 12:41) [31]>sniknik © (20.02.03 16:20)
>Label1.Caption:= IntToStr(MaxProgress);
>Application.ProcessMessages; //не знаю зачем стоит и без него работает но в примере хелпа стоит
Затем, что бы Label1 прорисовался, а не ждал завершения процедуры
← →
sniknik (2003-02-28 13:02) [32]Димон1 (28.02.03 12:41)
думаеш я не знаю для чего Application.ProcessMessages нужен?
не понятно зачем он нужен, там, процедура ведь завершается, и обработка идет в основной поток (ничем не занятый). вот это бы кто обьяснил.
подробнее (для тех кто не догоняет :о))).
логично и понятно если так
for i:= ? to ????? begin
.....
Application.ProcessMessages;
.....
end;
непонятно
procedure ...
begin
....
Application.ProcessMessages
end;
чего ждать? и так завершилась. И работает и отрисовывается есть он там или нет.
← →
jocko (2003-02-28 13:57) [33]Народ, а ни кто не пытался использовать OPTION (FAST n) в запросе, просто интересно, будет работать?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.008 c