我有以下代码:
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条记录真是太糟糕了。
答案 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