Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

обновление DataSet'а не работает... [D5, access]


Maxim2030 ©   (2004-05-07 06:58:00) 

Добрый день.

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

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-08 12:37:00) [1]

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

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

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

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


Maxim2030   (2004-05-08 08:27:00) [2]

> 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-07 21:07:00) [3]

> CommandType must be cmdTableDirect


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

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

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


sniknik   (2004-05-07 10:50:00) [5]

> И еще 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.


sniknik   (2004-05-07 10:47:00) [6]

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


Erik   (2004-05-07 10:03:00) [7]

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


sniknik   (2004-05-07 08:45:00) [8]

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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо