Odbcresultset

Тема в разделе "Lotus - Программирование", создана пользователем Anatoly, 19 май 2011.

  1. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Столкнулся с ситуацией что ODBCResultSet возвращает не все записи по сравнению с таким-же SQL-запросом на самом MS SQL сервере.
    Получить больше 4112 записей никак не получалось (хотя на самом деле должно быть 6912). После изменения свойства .CacheLimit с дефолтного на DB_ALL, возвращает положенное. А есть еще и .FetchBatchSize, дефолтное значение которого =1 пока не трогал.
    Почему количество кешируемых записей по умолчанию имеет такое "засадное" значение?
    Как играя данными свойствами не нарушить производительности? Иметь везде .CacheLimit =DB_ALL мне кажется не очень правильным, так как некоторые запросы будут возвращать до 50-60 тысяч записей для анализа в агенте.
     
  2. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    А как считал? По-идее, если проходить строки, то должен обойти все, что возвращает запрос, а не только закешированные.
    К сож проверить не могу, не имею сиквела под рукой...
     
  3. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Агент получает записи от MS SQL сервера, либо создает новый документ в базе LN, либо получает ссылку на существующий и обновляет поля.
    Я просто уже ввел счетчик

    RetCode = ResDog.FirstRow
    Cnt =0
    Do While RetCode = True
    cnt =cnt+1
    ...
    RetCode =resDog.NextRow
    Loop

    Так вот cnt=4112 после отработки агента, тот-же SQL запрос, что был в ODBCQuery.SQL на самом сервере возвращает 6912 записей.
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    А почему справку не читаешь?
    Возможно, поведение программы это и не изменит, но попробовать стоит.
     
  5. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    :lovecodeby: Приведенный вариант я попробовал только сегодня утром, в поисках.
    А до вчерашнего дня было:

    res.Execute
    Do
    res.NextRow
    <...>
    Loop Until res.IsEndOfData

    Вид тот-же, результат был тот-же.
    Только после .CacheLimit =DB_ALL обработались все записи.
     
  6. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Что ж... "на этом мысли заканчиваются" :) А тестить не на чем, а подымать себе сиквел... ну не хочется :lovecodeby:
    В любом случае, лучше использовать .IsEndOfData для проверки.
     
  7. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Да проблема как бы снялась...
    Остался вопрос об оптимальном подборе .CacheLimit и .FetchBatchSize для разных ситуаций.
    В хелпе никаких рекомендаций не нашел. Кроме что-бы второе было не больше первого :)
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    а может вопрос не имеет отношения к нотусам? :lovecodeby:
    курить мсявые спеки, одбц, и прочие шняжки...
    или из хелпа Examples: NumRows method:
    Код (Text):
    Uselsx "*LSXODBC"
    Sub Initialize
    Dim con As New ODBCConnection
    Dim qry As New ODBCQuery
    Dim result As New ODBCResultSet
    Dim firstName As String
    Dim lastName As String
    Dim msg As String
    Set qry.Connection = con
    Set result.Query = qry
    con.ConnectTo("ATDB")
    qry.SQL = "SELECT * FROM STUDENTS ORDER BY LASTNAME"
    result.Execute
    result.LastRow
    msg = "Student names:" & Chr(10)
    For i = 1 To result.NumRows
    result.CurrentRow = i
    firstName = result.GetValue("FIRSTNAME", firstName)
    lastName = result.GetValue("LASTNAME", lastName)
    msg = msg & Chr(10) & firstName & " " & lastName
    Next
    Messagebox msg,, "Student Names"
    result.Close(DB_CLOSE)
    con.Disconnect
    End Sub
     
  9. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Все может быть, но:
    -
    res.CacheLimit =DB_ALL
    res.Execute
    res.LastRow
    Print "NumRows =" & Cstr(res.NumRows)
    Возвращает 6192 записи
    -
    если закомментировать 1 строку
    'res.CacheLimit =DB_ALL
    res.Execute
    res.LastRow
    Print "NumRows =" & Cstr(res.NumRows)
    Возвращает 1 (!)
     
  10. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Потестировал тут...
    ---
    Call con.ConnectTo("Server1","sa","sa")
    Set qryAdU.Connection = Con
    Set resAdU.Query = qryAdU
    resAdU.CacheLimit =DB_ALL
    qryAdU.SQL = "SELECT TOP 10 * FROM dbo.Adr"
    resAdU.Execute

    Dim cnt As Long
    Cnt =0
    Do
    resAdU.NextRow
    cnt =cnt+1
    ...
    Loop Until resAdU.IsEndOfData
    Print Cstr(cnt)
    ---
    при resAdU.CacheLimit =DB_ALL обрабатываются всего 6 записей (1,3,5,7,9,10)
    если закомментарить - обрабатываются все 10

    что-то я непонятках
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    ну значит "каковы гномы - таковы и клады" :)
    пробуем другие ОДБЦ дриверы
     
Загрузка...
Похожие Темы - Odbcresultset
  1. Miolnir
    Ответов:
    1
    Просмотров:
    1.636

Поделиться этой страницей