Nicht alle Zeilen im Recordset enthalten
-
Hi Leute!
Ich greif über ODBC auf Access zu. Mit nem
Select * From TestTabmüsste er doch alle Zeilen der Tabelle in das Recordset einfügen.
Ich bekomm aber nur die erste Zeile geliefert und die beiden anderen in der TAbelle enthaltenen kommen nicht mit rüber.
An was kann das liegen?
Es müssten also 3 Records vorhanden sein, es existiert aber im Programm nach dem Zugriff nur einer.Ranger
-
poste doch mal den code wie du die sql-abfrage machst und zur nächsten zeile springst.
-
Hi Leute!
Ich will zur letzten Zeile springen, aber egal.Ich poste mal den Quellcode, obwohl die Abfrage ja woanders auch passt:
CString sODBCName = "ODBCTest"; CDatabase dbmydata; TestTbl mydata(&dbmydata); dbmydata.Open(sODBCName); if(dbmydata.IsOpen()) { mydata.Open(CRecordset::snapshot, "Select * From TestTab"); if (mydata.IsBOF()) { } else { mydata.MoveLast(); help = mydata.m_SatzID; } mydata.Close(); dbmydata.Close(); }Ich hoffe Ihr erkennt den Fehler. Aber wie gesagt an anderen Stellen holt er auch alle vorhandenen Datensätze auf die gleiche Weise.
Ranger
-
Hallo !
Du öffnest mit "Open()" einen Recordset. Wenn Datensätze vorhanden sind, wird automatisch der erste ausgewählt (das ist nun mal so). Dann fragst du mit "IsBOF()" ab, ob der erste ausgewählt ist, und das trifft nun mal immer zu, wenn Datensätze vorhanden sind. Das Programm geht also in den if-Block, in dem nix drin steht. Dann wird der Recordset wieder geschlossen. Fertig.
In den else-Block geht das Programm nur, wenn nach dem Open() nicht IsBOF() zutrifft. Das ist der Fall, wenn keine Datensätze vorhanden sind (bei einer leeren Tabelle). Da sagst du aber MoveLast(), was das Programm wahrscheinlich zum Absturz bringt, spätestens aber, wenn du den nicht vorhandenen Datensatz ausliest.
Du hast kein MoveNext() und auch keine while-Schleife. Daher kann doch nur höchstens ein Datensatz zurück geliefert werden...
Tschüss
P.S.:
Du meinst bestimmt statt IsBOF() IsEOF().
-
Hallo, das kann nicht wirklich sein.
IsBOF fragt nach, zeigt an, ob Sätze vorhanden sind. Wenn nein, dann hab ich zwar in obigem Fall keien Fehlerbehandlung.
In anderen Fällen klappt das so auch. Das ist die einzige Situation.
Der Else - Zweig ist der einzige, der abgearbeitet wird, wenn Sätze vorhanden sind.
Ich versuche mit MoveLast den letzten Zu bekommen.
In meinem Fall ist ein Satz vorhanden, also er geht in den Else Zweig rein. Der eine Satz ist aber nicht der den ich will, es existiert nach der Abfrage aber nur einer im Recordset, obwohl "Select * ..." alle vorhandenen Sätze liefern muss, wenn keien Where Klausel existiert und das ist nicht der FAll.Ranger
-
Wenn Datensätze vorhanden sind liefert isBOF true zurück,isEOF liefert false zurück wenn Datensätze vorhanden sind.
Woher weisst du das keine anderen Datensätze im Recordset sind,wenn du nicht durch alle durchgehts?
-
Das Problem liegt darin, dass er ja trotz eines vorhandenen Satzes in den Else Zweig geht, also liefert IsBOF false, obwohl Sätze vorhanden sind.
Nonzero if the recordset contains no records or if you have scrolled backward before the first record; otherwise 0.
Also hier steht, wenn ich dem Englischen mächtig bin, dass es true ergibt, wenn keine Sätze vorhanden sind, sonst false, weil der Recordset dann auf den ersten eingestellt sein sollte, also die Abfrage passt.
Woher weisst du das keine anderen Datensätze im Recordset sind,wenn du nicht durch alle durchgehts?
Ich kenn den Inhalt der TAbelle und mit MoveLast() müsste ich zum letzten Satz kommen und das ist der erste in der Tabelle. Also Ich hab auch mal mit GetRecordCount() nachgesehen und da steht die Zahl 1 drin. Also liefert er mir für die angegebene SQL Query nciht das richtige Ergebnis.
Ranger
-
Ohne Sortierung kannst du nicht sicher sein,welcher Datensatz an welcher stelle kommt.Hast du GetRecordCount() vor oder nach MoveLast() aufgerufen.GetRecordCount() liefert nur das richtige Ergebnis wenn vorher moveLast() aufgerufen hat.
-
Egal, wo ich es aufrufe, es steht nur 1 Satz im RecordSet. Die Sätze müssten aber in der reihenfolge in dem Recordset stehen, wie sie in der TAbelle stehen, denn in der Tabelle sind sie schon richtig sortiert, oder muss das nicht so sein?
Ranger