VB6 ADODB.Recordset RecordCount-Eigenschaft gibt immer -1
Ich versuche, einige alte VB6-code für die Arbeit mit SQL Server Compact.
Kann ich eine Verbindung herstellen, öffnen Sie die Datenbank und alles scheint gut. Ich kann laufen, insert-select-Befehle die Arbeit.
Jedoch der ADODB.Recordset RecordCount-Eigenschaft gibt immer -1, auch wenn ich auf die Felder und die Daten sehen. Ändern Sie die CursorLocation = adUseClient führt zu einem problem, wenn executung SQL (multiple-step operation generated errors).
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
Jede Beratung wäre dankbar angenommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich die
CursorLocation
spielt eine wichtige Rolle in diesem Fall. Verwendenrs.CursorLocation = adUseClient
festlegen der cursor-Position und versuchen.Das ist ein Ergebnis der Art von cursor verwendet, um den Zugriff auf die Daten, dieser Beitrag behandelt die Problematik und mögliche Updates.
http://www.devx.com/tips/Tip/14143
BEARBEITEN
Ich entschuldige mich dafür, dass Sie nicht mehr aufmerksam auf die Tatsache, dass Sie wurden der Umgang mit Compact. Mit Kompakt-die situation ist ähnlich der, die ich verwiesen, als dass es nutzt forward nur Cursor standardmäßig (nicht unterstützen Zeilenanzahl) aber es gibt zwei andere cursor-Typen verfügbar, wie beschrieben in den link unten.
http://support.microsoft.com/kb/272067
Überprüfen Recordset-Eigenschaft
Die Folgen Ergebnis, dass die RecordCount-Wert zurückgegeben, der von com.status.live-code
Hier ist eine Lösung für Sie, die ich verwendet
Aus dem Speicher arbeite mit VB6/ADO vor langer Zeit der .RecordCount-Feld nicht mehr zurück, aussagekräftige Daten, bis Sie verschoben haben, bis das Ende des Recordsets.
Obwohl mit diesem müssen Sie sicherstellen, dass Sie die entsprechende cursor-Typ (D. H., nicht nur vorwärts).
Die einzige andere Lösung, die ich denken kann, ist zu tun, einen separaten SELECT COUNT(*) FROM myTestTable, etc, aber dieses hat Probleme mit den Daten, wenn zwischen, call, und die eine, die tatsächlich gibt die Zeilen zurück.
Mit Compact die Standard-cursor-Attribut ist adOpenForwardOnly für eine verbesserte Leistung. Als solche RecordCount zurück, wie "-1", was bedeutet, dass es nicht verfügbar ist, statt leer. Dies ist beabsichtigt, da die Anzahl der Datensätze in einem dynamischen cursor ändern könnte und das Ergebnis in einem Ping hin und her zwischen dem client-server zu pflegen Genauigkeit. Allerdings, wenn Sie die Anzahl der Datensatz ist entscheidend, versuchen Sie, es zu verwenden oder adOpenStatic adOpenKeyset mit einem serverseitigen cursor.
Versuchen Sie es mit folgenden code, wenn noch gibt -1 zurück,
Können Sie versuchen, so etwas wie dieses..
Ersetzen
Set rs = mCmd.Execute
mit:Den
adOpenDynamic
ermöglicht eine vorwärts - /rückwärts-Lesen Sie sich durch, um Ihre recordcount.Code unten könnte Ihnen helfen,
Dieser folgende code gibt die recortcount genau...