VB6 ADODB.Jeu d'enregistrements propriété RecordCount renvoie toujours -1
Je suis en train d'essayer d'obtenir quelques vieux VB6 code pour travailler avec SQL Server Compact.
Je peux me connecter, ouvrez la base de données et tout semble bien. Je peux courir insérer les commandes select qui travail.
Cependant le ADODB.Jeu d'enregistrements propriété RecordCount renvoie toujours -1 même si je ne peux accéder aux Champs et voir les données. La modification de la CursorLocation = adUseClient provoque un problème lorsque executung SQL (en plusieurs étapes opération a généré des erreurs).
Option Explicit
Private Const mSqlProvider As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;"
Private Const mSqlHost As String = "Data Source=C:\Database.sdf;"
Private mCmd As ADODB.Command ' For executing SQL
Private mDbConnection As ADODB.Connection
Private Sub Command1_Click()
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim DbConnectionString As String
DbConnectionString = mSqlProvider & _
mSqlHost
Set mDbConnection = New ADODB.Connection
mDbConnection.CursorLocation = adUseServer
Call mDbConnection.Open(DbConnectionString)
If mDbConnection.State = adStateOpen Then
Debug.Print (" Database is open")
' Initialise the command object
Set mCmd = New ADODB.Command
mCmd.ActiveConnection = mDbConnection
mCmd.CommandText = "select * from myTestTable"
mCmd.CommandType = adCmdText
Set rs = mCmd.Execute
Debug.Print rs.RecordCount ' Always returns -1 !!
Debug.Print rs.Fields(0) ' returns correct data for first row, first col
Debug.Print rs.Fields(1) ' returns correct data for first row, 2nd col
Debug.Print rs.Fields(2) ' returns correct data for first row, 3rd col
End If
End Sub
Tout conseil serait acceptée avec reconnaissance.
OriginalL'auteur Belliez | 2010-02-17
Vous devez vous connecter pour publier un commentaire.
Fait le
CursorLocation
joue un rôle majeur dans cette affaire. Utilisationrs.CursorLocation = adUseClient
pour définir l'emplacement du curseur et de l'essayer.Si CursorLocation lecteurs le comportement, il est également dépendante sur le pilote que vous utilisez. Effectivement rs.CursorLocation = adUseClient permet les curseurs du pilote à être utilisé. Consultez la documentation du pilote que vous utilisez (Microsoft.SQLSERVER.EC.OLEDB.3.5) pour son curseur capacités. CE pilote peut pas les fournir. Dans ce cas, vous pourriez regarder pour un pilote mis à niveau.
Pouvez-vous définir la propriété CursorLocation de l'objet de connexion?
Qu'est-ce que la mise à jour sur cette question?
OriginalL'auteur Kangkan
C'est un résultat du type de curseur utilisé pour accéder aux données, ce poste couvre le problème et les solutions possibles.
http://www.devx.com/tips/Tip/14143
MODIFIER
Je m'excuse pour ne pas être plus attentifs au fait que nous avions affaire à un Compact. Avec un Compact, la situation est similaire à celle que j'ai référencé, car il utilise les curseurs avant uniquement par défaut (qui ne supportent pas de nombre de lignes), mais il existe deux autres types de curseurs disponibles comme indiqué dans le lien ci-dessous.
http://support.microsoft.com/kb/272067
OriginalL'auteur cmsjr
Vérifier La Propriété Recordset
Le suivre est le résultat que RecordCount valeur retournée par com.statut.live code
OriginalL'auteur YHkim
Voici une solution pour vous que j'ai utilisé
OriginalL'auteur Syagin Cdit
À partir de la mémoire de travail avec VB6/ADO il y a longtemps le .RecordCount champ ne retourne pas de données significatives jusqu'à ce que vous avez déménagé à la fin du jeu d'enregistrements.
Si avec cela, vous devrez vous assurer que vous avez ce type de curseur (c'est à dire, pas uniquement vers l'avant).
La seule autre solution je pense est de faire un distinct SELECT COUNT(*) FROM myTestTable, etc, mais cela a des problèmes avec les données de changement entre cet appel, et celui qui renvoie en fait les lignes.
OriginalL'auteur Gareth Wilson
Compact avec le curseur par défaut de l'attribut est adOpenForwardOnly pour l'amélioration de la performance. En tant que tel RecordCount est renvoyé en tant que "-1", ce qui signifie qu'il n'est pas disponible, plutôt que vide. C'est normal, parce que le nombre de fichiers dans un curseur dynamique pourrait changer et entraîner une requête ping à l'arrière-et-vient entre le client et le serveur afin de maintenir l'exactitude. Toutefois, si le nombre d'enregistrements est vital essayez d'utiliser adOpenKeyset ou adOpenStatic avec un curseur côté serveur.
OriginalL'auteur jasonk
Vous pouvez essayer quelque chose comme cela..
OriginalL'auteur Kentot
Remplacer
Set rs = mCmd.Execute
avec:La
adOpenDynamic
permettra à un avant/arrière de lire à travers pour obtenir votre recordcount.Pouvez-vous être plus précis? Quelle erreur s'est produite?
l'erreur qui s'est produite est celui que j'ai mentionné dans mon commentaire. Comme je passais plus de rs.ouvert il dit "des Erreurs se sont Produites. [,,,,,,]" ce qui n'est pas très détaillé!!!!
voir mon édité réponse.
OriginalL'auteur C-Pound Guru
Code ci-dessous pourraient vous aider,
OriginalL'auteur Ashfak Balooch
Essayez d'utiliser code suivant si renvoie toujours -1
OriginalL'auteur Shailendra Sah
Ce code suivant renvoie la recortcount exactement...
OriginalL'auteur ELANGOVAN