juergi66 Geschrieben 19. Oktober 2001 Geschrieben 19. Oktober 2001 Hallo, mit beiden Funktionen speichere ich ID-TAG-Informationen in einer Access-Datenbank ab. Das hat alles ca. 500 Datensätze wunderbar geklappt. Doch auf einmal geht nichts mehr. Nach dem Schreiben der Daten in die Datenbank rufe ich die Funktion GetMaxID() auf, die mir den letzen Datensatz liefert. Dann erhält der nächste Datensatz folglich eine um eins erhöhte ID. Doch plötzlich liefert mir die Funktion GetMaxID immer die gleiche ID als Rückgabewert und dann knallts natürlich wegen doppelter ID. Die ID ist mein Primärschlüssel. Kann mir einer helfen? Das ganze lief ja eigentlich! Sehr seltsam! void CAccessMP3View::InsertDB(int iLoop) { //ID für den neuen Datensatz ermitteln long lNewID = m_pSet->GetMaxID() + 1; //Den Datensatz hinzufügen m_pSet->AddNew(); m_pSet->m_ID = lNewID; m_pSet->m_ARTIST = m_strctFuelle[iLoop].strctArtist; m_pSet->m_TITLE = m_strctFuellen[iLoop].strctTitle; m_pSet->m_ALBUM = m_strctFuellen[iLoop].strctAlbum; m_pSet->m_GENRE = m_strctFuellen[iLoop].strctGenre; m_pSet->m_YEAR = m_strctFuellen[iLoop].strctYear; m_pSet->m_PFAD = m_strctFuellen[iLoop].strctPath; //Datensatz speichern m_pSet->Update(); //Den Recordset aktualisieren; m_pSet->Requery(); } long CAccessMP3Set::GetMaxID() { //Zum letzten Datensatz gehen MoveLast(); //ID dieses Datensatzes zurückgeben return m_ID; } Zitieren
mst Geschrieben 25. Oktober 2001 Geschrieben 25. Oktober 2001 Hi, ich vermute ganz einfach, das die Datenbank zwischen durch sortiert worden ist und deshalb der letzte Datensatz nicht mehr die höchste ID hat. Ich wurde das MoveLast() durch eine SQL-Abfrage ersetzen, die z.B. Absteigend nach ID sortiert und dann kannst du ja den ersten Datensatz nehmen. Vielleicht kann ich dir ja damit helfen. Zitieren
juergi66 Geschrieben 29. Oktober 2001 Autor Geschrieben 29. Oktober 2001 JA, ich noch mal. Habe das jetzt auch mal mit dem SQL - Befehl sortiert, aber das Ergebnis ist das gleiche. Irgendwann ( auffälliger Weise nach ca. 500 Datensätzen ) erhalte ich als Rückgabewert nicht mehr den letzten datensatz. Es kann doch nicht sein, daß Access nicht mit 500 Datensätzen zurecht kommt, oder? Tja manchmal gehts auch 1000 Sätze gut ,aber manchmal auch nur einen. BITTE HELFT MIR!!!! Gruß Onkel Zitieren
PhOen1X Geschrieben 31. Oktober 2001 Geschrieben 31. Oktober 2001 2.Versuch: Hatte gestern ein ähnliches Problem bei meiner Db. Konnte es dadurch lösen, daß ich den CRecordset von snapshot auf dynaset geändert hab. Zitieren
juergi66 Geschrieben 2. November 2001 Autor Geschrieben 2. November 2001 Hi Phoenix, das war genial. Habe von Snapshot auf Dynaset umgestellt. Jetzt funzt es. Was ist da eigentlich der Unterschied? Und nochmal danke!!!!! Zitieren
Crush Geschrieben 2. November 2001 Geschrieben 2. November 2001 Ein Dynaset wird immer auf die Änderungen des Users direkt abgestimmt und entspricht immer 100% dem aktuellen Stand, während ein Snapshot die Datenbank in chronologischer Reihenfolge als statische Struktur betrachtet, die genau so aussieht, wie in dem Moment als der Recordset von der Datenbank geöffnet und dem Anwender zur Verfügung gestellt wird. Änderungen werden nicht augenblicklich sichtbar und die Datenbank darauf abgestimmt. Man muß da selber mit Requery den Recordset updaten. Selbst M$ empfiehlt sofern man mit ODBC objektorientiert arbeitet lieber auf die CDaoRecordsets zuzugreifen. Wenn man einen Recordset benutzen möchte, der die Datenbank eigenständig updated, dann soll man mit RFX (Record Field Exchange) arbeiten. Das ist so ziemlich dasselbe wie DDX für member-Variablen, nur daß diese halt für Datenbank-Records und -Felder gelten siehe: CRecordset: :DoFieldExchange() oder auch eine davon erweiterte Variante ist die Bulk-Exchange-Klasse: CRecordset: :DoBulkFieldExchange(). Es ist sehr empfehlenswert weil bequem die exclusiven Daten-Transfers alle über die RFX-Functions laufen zu lassen. <FONT COLOR="#a62a2a" SIZE="1">[ 02. November 2001 20:10: Beitrag 3 mal editiert, zuletzt von Crush ]</font> Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.