Comment obtenir un nombre d’enregistrements à partir d’un jeu d’enregistrements de SQL Server CE


Résumé


Une question commune et une source de confusion dans l’accès aux données, programmation est « Comment obtenir un nombre d’enregistrements ? »

Si vous ouvrez un curseur avant uniquement sur une table SQL Server CE et que vous essayez d’obtenir le nombre d’enregistrements à l’aide du code suivant, ADOCE renvoie -1 comme nombre d’enregistrements :

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

Plus d'informations


Ce comportement est voulu par la conception. Pour être rapide, est moins de fonctionnalités dans le curseur avant uniquement. Voici quelques points importants sur la façon d’obtenir un nombre d’enregistrements :

  • La possibilité d’obtenir un nombre d’enregistrements dépend du type de curseur. Certains curseurs sont très « bon marchés », dans la mesure où ils sont rapides ou peu de mémoire. Autres curseurs sont plus lente/utiliser plus de mémoire, mais également de fournir davantage de fonctionnalités, telles que la possibilité de défiler vers l’arrière ou d’obtenir un nombre d’enregistrements.
  • Résultats un curseur avant uniquement des requêtes par rapport à SQL Server CE ne prend pas en charge l’obtention d’un nombre d’enregistrements. Il ne Précalcule le nombre de lignes sera retourné à partir de la requête. ADO retourne -1 parce qu’il ne peut pas accéder à l’interface qui est utilisée pour obtenir le nombre d’enregistrements.
  • Les curseurs de défilement requête sont les seuls types de curseurs capable de retourner le nombre d’enregistrements précis. Ces curseurs sont plus chers (dans la mémoire, principalement). Le nombre d’enregistrements peut être une opération coûteuse.
  • En fonction de votre scénario, vous pourrez peut-être effectuer un « Sélectionnez Count à partir de la table ... » pour obtenir un nombre d’enregistrements précédent avant de commencer l’extraction.

Curseurs avant uniquement

Les curseurs avant uniquement dans SQL Server CE ne peut pas déterminer le nombre d’enregistrements vont être retournées. Pour fournir la plus rapide, curseur de moins gourmandes en mémoire, le processeur de requêtes est réellement quotidien les lignes qu’elle détermine les. Il n’existe aucune étape de mise en mémoire tampon où le nombre de lignes est prédéterminé.


Les curseurs de défilement requête dans CE de SQL Server, d’autre part, de la mémoire tampon lignes tel qu’elles sont lues. Si l’utilisateur demande un nombre de lignes, les lignes sont mises en mémoire tampon afin qu’ils peuvent être pris en compte. Étant donné que vous pouvez faire défiler vers l’arrière sur le jeu de résultats, cependant, il est alors possible de relire les valeurs des lignes après que qu’ils ont été mis en mémoire tampon pour le comptage.


Le code suivant montre comment utiliser la table de base, avant uniquement et les curseurs avec défilement pour ouvrir des jeux d’enregistrements à l’aide d’ADOCE et eVB. Seuls les curseurs avec défilement donnent un nombre d’enregistrements précis :


Remarque: pour SQL Server CE 2.0 pour travailler avec l’exemple de code, vous devez modifier la chaîne de connexion à partir de

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

"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