ADODB.Recordset AbsolutePage不能与Oracle数据库(ASP.net)一起使用

时间:2011-08-04 19:54:14

标签: asp.net vb.net oracle com ado

我有以下代码:

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:当前Recordset不支持书签。这可能是提供者或所选cursortype的限制。” 错误页面指向“Objrs.AbsolutePage = PageNum”

如果我在这里做错了什么,或者我能做些什么来绕过它?在一页上显示500条记录真是太糟糕了。

1 个答案:

答案 0 :(得分:1)

我有点天真的猜测,鉴于我对ADODB知之甚少,是ADODB的Oracle提供商不支持分页。 documentation for the AbsolutePage property确实表明了这一点:

  

提供商必须支持此属性的适当功能。

因此,您可以在Oracle查询中进行分页,而不是在ADO和VB.NET中进行分页。

使用Oracle进行分页的典型方法是使用如下查询。这将返回表some_table的第31行到第40行,这将是10行页面的第4页:

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