ADODB.Recordset AbsolutePage не работает с базой данных Oracle (ASP.net) - PullRequest
0 голосов
/ 04 августа 2011

У меня есть следующий код:

Dim PageNum AS Integer = 1
Dim ThePageSize As Integer = 30
Dim RowCT As Integer = 0

Dim SqlStr As String = "SELECT * FROM TheTable"
Dim TCConStr As String = ConfigurationManager.ConnectionStrings("TCConStr").ConnectionString

Dim Objrs As New ADODB.Recordset

Objrs.Open(SqlStr, TCConStr, 3, 3)

If Not Objrs.EOF Then
  Objrs.MoveFirst()
  Objrs.PageSize = ThePageSize
  Dim TotalPages As Integer = Objrs.PageCount
  Objrs.AbsolutePage = PageNum
End If

While Not Objrs.EOF And RowCT < Objrs.PageSize
  RowCT = RowCT + 1

  'Do Stuff

  Objrs.MoveNext()
End While
Objrs.Close()
Objrs = Nothing

Когда я пытаюсь запустить его, я получаю: "System.Runtime.InteropServices.COMException: Current Recordset не поддерживает закладки. Это может быть ограничениемпоставщика или выбранного курсорного типа. "Страница с ошибкой указывает на «Objrs.AbsolutePage = PageNum»

Есть идеи, если я сделал что-то здесь не так, или что я могу сделать, чтобы обойти это?Было бы ужасно показывать 500 записей на одной странице.

1 Ответ

1 голос
/ 05 августа 2011

Мое наивное предположение, учитывая, что я очень мало знаю об ADODB, заключается в том, что поставщик Oracle для ADODB не поддерживает подкачку страниц. Документация для свойства AbsolutePage действительно предлагает следующее:

Поставщик должен поддерживать соответствующую функциональность, чтобы это свойство было доступно.

Таким образом, вместо подкачки страниц в ADO и VB.NET вы можете выполнять подкачку в запросе Oracle.

Типичный способ выполнения пейджинга в Oracle - использовать запрос, подобный следующему. Это возвращает 31-ю к 40-й строкам таблицы some_table, что будет для 4-й страницы 10-строчных страниц:

SELECT a, b, c
  FROM (SELECT a, b, c, ROWNUM as num
          FROM some_table
         WHERE ROWNUM <= 40)
 WHERE num > 30

Два числа в этом запросе должны быть PageNum * ThePageSize и (PageNum - 1) * ThePageSize в этом порядке.

Обратите внимание, что если запрос, который вы пытаетесь отобразить на странице, содержит предложение ORDER BY или предложение GROUP BY, вам нужно переместить его в другой подзапрос. Например, если бы нам нужно было отсортировать по столбцу b и затем отобразить результаты, мы бы использовали что-то вроде:

SELECT a, b, c
  FROM (SELECT a, b, c, ROWNUM as num
          FROM (SELECT a, b, c 
                  FROM some_table
                 ORDER BY b)
         WHERE ROWNUM <= 40)
 WHERE num > 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...