Sumário

Uma pergunta comum e uma fonte de confusão no acesso a dados a programação é "Como obter uma contagem de registros?"

Se você abrir um cursor somente de encaminhamento em uma tabela do SQL Server CE e tenta obter a contagem de registros usando o código a seguir, ADOCE retornará -1 como a contagem de registros:

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

Mais informações

Esse comportamento é pré-definido. Para que sejam rápidos, há menos funcionalidade no cursor forward-only. A seguir estão alguns pontos importantes sobre como obter uma contagem de registros:

  • A capacidade de obter uma contagem de registros depende do tipo de cursor. Alguns cursores são muito "baratos", eles são rápidos e/ou usam de pouca memória. Outros cursores são mais lentos/usar mais memória, mas também fornece mais funcionalidade, como a capacidade de rolar para trás ou obter uma contagem de registros.

  • Um cursor de resultado de consulta somente de encaminhamento contra o SQL Server CE não oferecem suporte à obtenção de uma contagem de registros. Não précomputar quantas linhas serão retornadas da consulta. ADO retorna -1 porque não é possível obter a interface que é usada para obter o número de registro.

  • Cursores de consulta rolável são o único tipo de cursores que pode retornar contagens precisas de registro. Esses cursores são mais caras (na memória, na maioria das vezes). Obter a contagem de registros pode ser uma operação cara.

  • Dependendo do cenário, você pode ser capaz de fazer um " Selecione count(*) da tabela ..." para obter um número de registros antes de iniciar a busca.

Cursores somente de encaminhamento

Cursores de encaminhamento somente no SQL Server CE não podem determinar quantos registros serão retornados. Para fornecer a mais rápida, menos cursor de muita memória, o processador de consultas é realmente retribuir as linhas conforme determina-los. Não há nenhuma etapa de buffer onde uma contagem de linhas é predeterminada.


Cursores roláveis consulta no SQL Server CE, por outro lado, buffer linhas conforme elas são encontradas. Se o usuário solicitar uma contagem de linha, as linhas são armazenados em buffer para que eles podem ser contados. Porque você pode rolar para trás ao longo do conjunto de resultados, no entanto, ele é possível ler novamente os valores das linhas depois que eles têm foi em buffer para contagem.


O código a seguir demonstra como usar a tabela base, somente de encaminhamento e cursores roláveis abrir recordsets usando ADOCE e eVB. Somente os cursores roláveis fornecem uma contagem precisa de registro:


Observação: para o SQL Server CE 2.0 para trabalhar com o código de exemplo, você deve alterar a sequência de caracteres de conexão

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

Para:

"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

Precisa de mais ajuda?

Expanda suas habilidades
Explore o treinamento
Obtenha novos recursos primeiro
Ingressar no Microsoft Insider

Essas informações foram úteis?

Qual é o seu grau de satisfação com a qualidade do idioma?
O que afetou sua experiência?

Obrigado pelos seus comentários!

×