![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
обновление 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 (если не спутал написание :)