Форум: "Базы";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Внизобновление 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.03 c