Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

обновление DataSet а не работает...   Найти похожие ветки 

 
Maxim2030   (2004-05-07 06:58) [0]

Добрый день.

имеем такой код:

Ds := TADODataSet.Create(nil);
DS.CommandText := "Select * from table";
DS.CursorType = ctUseServer;
Ds.Open();
после этого датасет привязывается к гриду и отображается.
Через время на других машинах в сети отображаемая табличка изменяется; надо отобразить эти изменения на экране.
пытаюсь сделать Ds.Requery(), DS.Resync(), DS.Refresh() - ничего не помогает ado выдает ошибку "this provider does not suuported refreshing with underlaying values"
БД - access2000 (MS Jet4.0)
Так работает:
tmp = DS.<Значения ключевых полей>
DS.Close;
DS.Open;
DS.Seek(tmp);
но как то криво само по себе а кроме того при большом объеме таблицы (>10000записей) зависает

подскажите как лечить?


 
sniknik ©   (2004-05-07 08:45) [1]

оставить как есть (лутший вариант), обновление только по запросу пользователя.
почему это лутше можеш поискать недавно обсуждалось (и не раз), повторятся надоело.

> но как то криво само по себе а кроме того при большом объеме таблицы (>10000записей) зависает
чтото у тебя не так, больших зависаний не должно быть, у тебя же серверный курсор должно тянутся только то что отображается. хотя, access? возможно разное проявление (ну к примеру тянет все с начала до отображаемого), проверять ситуацию тоже не хочется, ввиду того что считаю безсмысенной такую логику.

еще вариант перейти на локальный и обновлять позаписьно (только измененные), см. статью на королевстве про ADO 2-3 части, поиск по resync command (если не спутал написание :)


 
Erik ©   (2004-05-07 10:03) [2]

Как я понимаю ты работаеш с таблицей и используеш курсорные методы? Тогда почему у тебя ADODataSet а не ADOTable? Хотя я нопомню как она внутри устроена, лучше всего открой через MsJet как таблицу! Тогда будь у тебя хоть 1000000 будет открыватся мгновенно.
И еще ctUseServer небудет работать, потому что это не SQL сервер а File Server. Как ты представляеш себе Seek с ctUseServer?


 
sniknik ©   (2004-05-07 10:47) [3]

> Тогда почему у тебя ADODataSet а не ADOTable?
это то как раз очень правильно, ADOTable это урезаная версия ADODataSet-а, его ни в коем случае лутше не использовать. (ADOTable  сделан только для "облегчения" перехода, и по моему зря, лутше бу совсем не было)


 
sniknik ©   (2004-05-07 10:50) [4]

> И еще ctUseServer небудет работать, потому что это не SQL сервер а File Server. Как ты представляеш себе Seek с ctUseServer?
будет, а Seek как раз только при серверном и работает.

Using the Seek method depends on the settings of a few properties. IndexName must be set to activate the index to use, CommandType must be cmdTableDirect (for TADODataSet, set TableDirect to true for a TADOTable), CursorLocation must be clUseServer, and CursorType must be ctKeySet.


 
Maxim2030   (2004-05-07 20:09) [5]

экспериментировал с reQuery(), close/open - результат по скорости примерно одинаковый.
причем что интересно, когда ручками вырезал из таблицы строки, начиная с некоторого момента скорость открытия стала нормальной. Например, когда 15тыс строк - ~0,5сек, а при постепенном увеличении кол-ва строк скорость резко падает, при 18 тыс строк - ~4-5 сек , при 28тыс строк - 200сек :(
причем никакой активности процессора или диска не наблюдается
выбоорка всегда отбирается и сортируется делается по индексу.
Вот еще что интересно: после упаковки базы, в которой было около 18 тыс строк скорость восстановилась до нормальной, но после некоторого кол-ва движений опять упала.
такое ощущение что акцесс при открытии блокирует страницы .mdb файла и при некотором кол-ве страниц начинает безбожно тормозить

может у кого есть какие идеи?


 
sniknik ©   (2004-05-07 21:07) [6]

> CommandType must be cmdTableDirect


 
Maxim2030   (2004-05-08 08:27) [7]

> CommandType must be cmdTableDirect

был бы рад, но там Sql :
select * from table where field1 in (1, 2, 5, ...) order by field2
в будущем в sql будет расширяться в секции where

есть индекс на field2 (char, 255) + field1 (integer)
менял индекс на field1+field2 - абсолютно тот же результат

под отладчиком смотрел - во время открытия управление находится где-то в msjet40.dll. установка последней версии (jet service pack 8) не помогла


 
sniknik ©   (2004-05-08 12:37) [8]

> DS.CommandText := "Select * from table";

> был бы рад, но там Sql :
> select * from table where field1 in (1, 2, 5, ...) order by field2
?
ну да ладно.

можно варьировать и посмотреть что будет быстрее, либо сделать это условие фильтром либо перейти на локальный курсор. (при локальном передача идет немного по другому, много раз замечал серверный + fetchall по времени дольше чем открыть локальный а он тоже на клиента все качает) + как уже говорил можно будет обновление делать позаписьно.

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



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
1-1084857230
SiJack
2004-05-18 09:13
2004.05.30
Как определить что MessageBox уже показано и не показывать


14-1083914781
Гарри Поттер
2004-05-07 11:26
2004.05.30
Коммерческая конференция - имеет право на жизнь? Ваше мнение?


14-1084361214
kombat
2004-05-12 15:26
2004.05.30
Как правильно проектировать программу


3-1083924108
WondeRu
2004-05-07 14:01
2004.05.30
Помогите написать SQL-запрос


4-1082549473
alexproger
2004-04-21 16:11
2004.05.30
Отсылка сообщения окну