【问题标题】:ADODB.Recordset AbsolutePage not working with Oracle Database (ASP.net)ADODB.Recordset AbsolutePage 不适用于 Oracle 数据库 (ASP.net)
【发布时间】:2011-10-20 08:05:58
【问题描述】:

我有以下代码:

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:当前记录集不支持书签。这可能是提供程序或所选游标类型的限制。” 错误页面指向“Objrs.AbsolutePage = PageNum”

如果我在这里做错了什么,或者我能做些什么来解决它,有什么想法吗?在一页上显示 500 条记录会很臭。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      相关资源
      最近更新 更多