如何获取从 SQL Server CE 记录集中的记录数

概要

一个常见的问题及源的数据访问中的混乱编程是"如何获取记录计数吗?"

如果打开仅向前游标在 SQL Server CE 表上的,并试图通过使用下面的代码获取记录的计数,ADOCE 返回记录数为:

rs.Open "SELECT * FROM mytable", cn, adOpenForwardOnly,
adLockReadOnly

详细信息

此行为是设计使然。若要快速,仅向前型游标中没有功能比较少。下面是一些要点上如何获取记录数:

  • 获取记录计数能力是取决于游标类型。某些游标是很"廉价"中,它们速度快和/或使用很少的内存。其它游标是慢/使用更多的内存,但也提供了更多的功能,例如能够向后滚动,或获取记录计数。

  • 针对 SQL Server CE 仅向前型查询结果游标不支持获取记录计数。它不会预先计算将从查询返回的行数。因为它不能获取到的接口,用于获取记录计数,ADO 将返回-1。

  • 可滚动的查询游标是可以返回准确的记录数的游标的唯一种类。这些游标是昂贵 (在内存中,大多数情况下)。获取记录数可以是代价高昂的操作。

  • 这取决于您的方案,您可能能够做到"选择表中的 count(*) ..."开始取之前重新获取的记录数。

仅向前型游标

在 SQL Server CE 仅向前型游标不能确定多少条记录都将返回。为了提供最快,最少占用大量内存的光标,查询处理器实际上产生回行因为它决定了它们。是没有缓冲的步骤的行的计数是预先确定的位置。


根据提取出来后,查询可滚动游标在 SQL Server CE,另一方面,缓冲行。如果用户请求的行数,行缓冲,以便可以对它们进行计数。因为您可以通过结果集向后滚动,但是,就可以重新读取的行的值后它们已缓冲的盘点。


下面的代码演示如何使用基表,仅向前型和可滚动游标使用 ADOCE 和 eVB 打开记录集。可滚动的游标提供准确的记录计数:


注意: SQL Server CE 2.0 使用示例代码,您必须更改中的连接字符串

"Provider=microsoft.sqlserver.oledb.ce.1.0;Data Source=\ssce.sdf"

自:

"Provider=microsoft.sqlserver.oledb.ce.2.0;Data Source=\ssce.sdf"


Dim cn As ADOCE.Connection
Dim rs1 As ADOCE.Recordset
Dim rs2 As ADOCE.Recordset
Dim rs3 As ADOCE.Recordset
Dim catalog

Private Sub Form_Load()

Dim str1 As String
Dim str2 As String
Dim str3 As String
Set cn = CreateObject("ADOCE.Connection.3.1")
Const strConnect = "Provider=microsoft.sqlserver.oledb.ce.1.0;Data Source=\ssce.sdf"


cn.Open strConnect

cn.Execute "Create table mytable (col1 int NOT NULL)"
cn.Execute "CREATE UNIQUE INDEX idx1 ON mytable(col1)"
cn.Execute "insert mytable values (70)"
cn.Execute "insert mytable values (71)"

' For Base table cursor, just supply table name as source, DO NOT WRITE A SELECT * statement.
' Should use adOpenDynamic and adLockOptimistic with adCmdTableDirect flag.

Set rs1 = CreateObject("ADOCE.Recordset.3.1")
rs1.Open "mytable", cn, adOpenDynamic, adLockOptimistic, adCmdTableDirect

str1 = rs1.RecordCount
rs1.Close
MsgBox "Record count: " & str1

' Forward-only cursor does not support record count.
' Forward-only cursors should use adOpenForwardOnly and adLockOptimistic.
' The adCmdTableDirect flag should not be used.

Set rs2 = CreateObject("ADOCE.Recordset.3.1")
rs2.Open "Select * from mytable", cn, adOpenForwardOnly, adLockOptimistic
str2 = rs2.RecordCount
rs2.Close
MsgBox "Record count: " & str2

' Scrollable cursors can use either adOpenStatic or adOpenKeyset.
' These cursors should use adLockReadOnly and not specify the adCmdTableDirect flag.
Set rs3 = CreateObject("ADOCE.Recordset.3.1")
rs3.Open "Select * from mytable", cn, adOpenStatic, adLockReadOnly
str3 = rs3.RecordCount
rs3.Close
MsgBox "Record count: " & str3

cn.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set rs3 = Nothing
Set cn = Nothing

End Sub

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

谢谢您的反馈意见!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×