Конференция "Базы" » Метод TADODataSet.Seek [D7, MSSQL]
 
  • yurikon (21.07.11 12:26) [0]
    Добрый день!

    В продолжение темы быстродействия работы с SQL  через ADO.

    Перед рефрешом таблицы я запоминаю id строки, чтобы после обновления поставить туда маркер методом Locate. Метод Seek по индексу должен это делать быстрее. Чтобы его использовать, нужен серверный курсор, CommandType= cmdTableDirect и указать имя индекса.

    Индекс в таблице точно есть, но при попытке открыть этот датасет вылетает ошибка - "Индекс не существует". Если указать свойство  CommandType= cmdTable, тогда ошибки нет, сортировка есть, но не работает Seek!

    В связи с этим вопрос: как запустить Seek и чем отличается Table и TableDirect (в хелпе по этой теме пусто)?

    С уважением,
     Юрий.
  • sniknik © (21.07.11 13:03) [1]
    > Чтобы его использовать, нужен серверный курсор, CommandType= cmdTableDirect и указать имя индекса.
    бред. индекс используется локальный.

    > вылетает ошибка - "Индекс не существует".
    правильно, так и есть.
    Sort:= 'FieldName';

    > чем отличается Table и TableDirect
    фактически Table это эмуляция с полной закачкой всей таблицы на клиента, изменения все одно идут запросами, TableDirect то же самое но с серверным курсором.
  • yurikon (21.07.11 15:03) [2]
    2 sniknik:

    при всем уважении ... это в хелпе написано было. Попробовал как Вы написали - не работает.

    Вот что удалось отыскать в msdn:

    "adCmdTableDirect

    Evaluates CommandText as a table name whose columns are all returned. Used with Recordset.Open or Requery only. To use the Seek method, the Recordset must be opened with adCmdTableDirect.
    This value cannot be combined with the ExecuteOptionEnum value adAsyncExecute."


    В общем, при попытке присвоить IndexName, вылетает ошибка "Поставщик не поддерживает сортировку и фильтрацию".

    Мож с провайдером что-то не так?
  • sniknik © (21.07.11 15:27) [3]
    > Мож с провайдером что-то не так?
    непосредственно индекс "из файла" поддерживался единственным провайдером - jet. именно про него
    > это в хелпе написано было.
    с MSSQL можно использовать только локальный.

    у меня показано как локальный на клиентском рекордсете просто создать. а как его использовать это можно в хелпе можно почитать. раз уж вместо кода и показа "как делал" пишешь
    > Попробовал как Вы написали - не работает.
  • Anatoly Podgoretsky © (21.07.11 15:28) [4]
    Locate работает так быстро, что нет смысла заморачиваться.
  • yurikon (21.07.11 15:53) [5]
    Да уже сам не рад, что заморочился. В моем случае и Locate покатит на 30 строк таблицы.

    Правильно, я понял, что в mssql через ADO seek работать не будет?  Если нет, то какие настройки в датасете должны быть тогда?

    С уважением.
  • sniknik © (21.07.11 16:58) [6]
    > в mssql через ADO seek работать не будет?
    это не единственная функция использующая индекс... Locate кстати тоже использует если он есть.
  • yurikon (21.07.11 17:39) [7]
    Ок, угомонился.

    Спасибо за обсуждение! ))
  • SQLEXPRESS (22.07.11 08:38) [8]

    > Locate работает так быстро, что нет смысла заморачиваться.

    >  Locate кстати тоже использует если он есть.


    +1
  • Anatoly Podgoretsky © (22.07.11 17:47) [9]
    > sniknik  (21.07.2011 16:58:06)  [6]

    Это вообще теряет смысл, в использование seek
  • Виталий Панасенко (26.07.11 15:05) [10]
    Для Д7
    Note: The VCL Seek method is a direct implementation of the Seek method for the ADO Recordset object. At the time of this writing, this method is only supported for use with Microsoft Access2000 and the Jet 4 provider.
  • Виталий Панасенко (26.07.11 15:06) [11]
    И для Access с установкой TableDirect и серверным курсором - внатуре пашет быстро
 
Конференция "Базы" » Метод TADODataSet.Seek [D7, MSSQL]
Есть новые Нет новых   [134431   +10][b:0][p:0]