2016-08-18 5 views
0

Ich arbeite an einer Anwendung und aus irgendeinem Grund habe ich ein Problem, etwas zu verstehen. Ich habe Code, der wie folgt aussieht ....For Next Loops geht weiter, wenn am Limit

dim number as integer 



number = rs.recordcount (only 1 record - so number = 1) 
for x = 1 to Number 
'stuff 
'stuff 
    rs.moveNext 
Next 

Ich gehe davon aus, dass, sobald es zu rs.MoveNext bekommt und geht dann auf zum nächsten, es sollte einfach die Schleife verlassen - doch scheint es, zurück zu gehen an den Anfang der Schleife, obwohl kein Datensatz vorhanden ist. Jeder hat eine Idee, warum das passiert?

+1

Ist es wegen der Header? Das liegt möglicherweise an der Tatsache, dass der Header Teil des Recordsets –

+4

ist. Wenn Sie nur die Datensätze durchlaufen möchten, ist es besser, 'Do While Not rs.EOF' zu verwenden, als auf die RecordCount-Eigenschaft zu vertrauen nicht immer zuverlässig) –

+1

@TimWilliams aus irgendeinem Grund scheint ich mich zu erinnern, nur zu überprüfen, 'EOF' einen Fehler zu werfen, wenn das Recordset keine Zeilen hat. Bin ich paranoid, um nach "BOF" zu suchen? –

Antwort

3

RecordCount gibt die Anzahl der Datensätze, die gelesen wurden, oder so ähnlich - es nicht die Gesamtzahl der Datensätze zurückgibt, wird dieser Wert nicht bekannt, bis der Re-Cord wiederholt wurde.

So eine For...Next Schleife kann ein Recordset nicht effizient durchlaufen.

Versuchen Sie, eine While Schleife statt:

While Not rs.BOF And Not rs.EOF 
    'stuff 
    rs.MoveNext 
Wend 
+3

Der Aufruf von 'RecordCount' * sollte * die Gesamtanzahl der Datensätze zurückgeben, aber den Cursor am Ende des Recordsets belassen. Wenn Sie also die Datensätze lesen möchten, müssen Sie zuerst' MoveFirst' aufrufen (und Sie müssen verwendet haben) die richtige Art von Cursor an erster Stelle ...) –

+2

Eh, sind die einzigen Recordsets, die ich verwende, was auch immer 'Command.Execute' zu ​​mir zurückkommt (das ist nur Forward-Only, oder?) –

1

Der Hauptgrund der Schleife nicht beendet ist, dass Sie es alle Bedingungen nicht gegeben haben, die es verursachen würde zu beenden.

Außerdem überprüft VB nicht jedes Mal die Schleifengrenze durch die Schleife. Es überprüft es nur am Anfang. Der folgende Code wird immer noch 100 Mal gedruckt, obwohl der Wert von Number geändert wurde:

Dim Number As Integer = 100 
For x As Integer = 0 To Number 
    Console.WriteLine(x) 
    Number = 99 
Next 
+0

Vielen Dank, das ist hilfreich ! – BobSki