kaldemor Geschrieben 15. April 2008 Geschrieben 15. April 2008 Hi, beim ausführen von ExecuteSQL() wird der Datensatz nicht aktualisiert. Dieses Problem taucht nur selten auf und deswegen kann ich es nicht nachvollziehen voran es liegen kann? z. B. Dieser Code wird im Programm immer aufgerufen wenn ein Vorgang abgeschlossen ist CString strSql; long lVorlaufigeNr, lNeueNr; lVorlaufigeNr = 10001775; lNeueNr = 12331; try { //UINT III_ID, LPCTSTR III_TEXTID, LONG lWert rs->m_strFilter.Format("L_ID = %d AND STR_ID = '%s'", III_ID, III_TEXTID); rs->Requery(); if(rs->GetRecordCount() > 0 ) { rs->Edit(); rs->m_L_ID = III_ID; rs->m_STR_ID = III_TEXTID; rs->m_L_FORMAT = 0; rs->m_STR_RET = ""; rs->m_L_RET = lWert; rs->Update(); } strSql.Format("Update MyTabelle Set Nummer = %ld, Status = TRUE Where Nummer = %ld AND Status = FALSE", lNeueNr, lVorlaufigeNr); dbDatabase.ExecuteSQL(strSql); // Datensatz wird in seltenen Fällen nicht aktualisiert } catch(CDBException *e) { AfxMessageBox(e->m_strError, MB_ICONEXCLAMATION); e->Delete(); return FALSE; } Hat jemand eine Idee? Mfg, kaldemor Zitieren
Klotzkopp Geschrieben 17. April 2008 Geschrieben 17. April 2008 Du lieferst nicht genug Informationen. Wird eine Exception geworfen, wenn das passiert? Wenn ja, was steht drin? Bist du wirklich sicher, dass es zu dem Zeitpunkt Datensätze gibt, die auf deine Bedingungen passen? Oder glaubst du nur, dass es so sein müsste? Lass dir doch vorher mal den Count ausgeben. CRecordset::Update hat nicht nur zum Spaß einen Rückgabewert. Was erhältst du da? Zitieren
kaldemor Geschrieben 17. April 2008 Autor Geschrieben 17. April 2008 Update gibt TRUE zurück. Ob es eine Fehlermeldung gibt, dass weiß ich nicht! Das Problem tritt sehr selten auf um es nachvollziehen zu können. Es sind Datensätze vorhanden. Obwohl habe ich bedenken, dass Daten erst nach 5 s. aktualisiert werden (PageTimeout = 5000) ODBC: Access 2000 Visual C++, MFC, Version 6.0 liegt das Problem ev. beim Open() mit snapshot? if( dbDatabase.IsOpen() == 0 ) return FALSE; rs = new CRecSet(&dbDatabase); if( !rs->Open(CRecordset::snapshot, "TABELLE", CRecordset::none) ) { dbDatabase.Close(); AfxMessageBox("Problem beim Öffnen TabelleSet"); return FALSE; } Mfg, kaldemor Zitieren
Klotzkopp Geschrieben 17. April 2008 Geschrieben 17. April 2008 Ob es eine Fehlermeldung gibt, dass weiß ich nicht!Wieso nicht? Erscheint die MessageBox oder nicht? Das Problem tritt sehr selten auf um es nachvollziehen zu können. Es sind Datensätze vorhanden. Obwohl habe ich bedenken, dass Daten erst nach 5 s. aktualisiert werden (PageTimeout = 5000)Wie bitte? Was wird aktualisiert? rs = new CRecSet(&dbDatabase); if( !rs->Open(CRecordset::snapshot, "TABELLE", CRecordset::none) ) { dbDatabase.Close(); AfxMessageBox("Problem beim Öffnen TabelleSet"); return FALSE; }Schönes Speicherleck. Gibt es in irgendeinem Zweig dieser Funktion ein delete zu diesem new? Zitieren
Klotzkopp Geschrieben 17. April 2008 Geschrieben 17. April 2008 Update gibt TRUE zurück. ... Das Problem tritt sehr selten auf um es nachvollziehen zu können. Nachtrag: Konntest du das Problem denn jetzt reproduzieren, oder gibt Update TRUE zurück, wenn sowieso alles klappt? Das wäre ziemlich uninteressant. Spannend wäre der Rückgabewert von Update, wenn der Fehler auftritt. Zitieren
kaldemor Geschrieben 17. April 2008 Autor Geschrieben 17. April 2008 Diese Fehler sind vereinzelt aufgetreten: 2007.07.18 und 2008.03.31 Das Microsoft Jet-Datenbankmodul hat den Vorgang angehalten, da Sie und ein weiterer Benutzer gleichzeitig versuchen, dieselben Daten zu verändern. 2007.11.07 Nicht genügend Arbeitsspeicher. 2008.02.18 Versuch zu aktualisieren oder zu löschen ist fehlgeschlagen. Zitieren
Klotzkopp Geschrieben 17. April 2008 Geschrieben 17. April 2008 Das Microsoft Jet-Datenbankmodul hat den Vorgang angehalten, da Sie und ein weiterer Benutzer gleichzeitig versuchen, dieselben Daten zu verändern.Haben da zwei Benutzer gleichzeitig das Programm benutzt? Nicht genügend Arbeitsspeicher.Und eben habe ich dich auf mögliche Speicherlecks hingewiesen. Kann es sein, dass du ziemlich leichtfertig mit new um dich wirfst, und dazu neigst, delete zu vergessen? Versuch zu aktualisieren oder zu löschen ist fehlgeschlagen.Das sagt nicht so viel aus. Aber zusammenfassend lässt sich sagen, dass du gar nicht weißt, was Update im Fehlerfall zurückgibt. Mein Rat: Such dein Programm erst mal gründlich nach Speicherlecks ab. Zitieren
kaldemor Geschrieben 17. April 2008 Autor Geschrieben 17. April 2008 Danke für die Hinweise! 1. Frage: Ja, es können mehrere Benutzer das Programm nutzen. (Server, Terminalverbindung) 2. Hinweis: New, Delete: Hab alles überprüft, delete wird immer dann nicht verwedet wenn try/catch aufgerufen wurde + Programmabsturz. In diesem Fall wird der Speicher nicht freigegeben. 3. Hinweis: Können Speicherlecks ExecuteSQL() in die bringen? Mfg, tocha 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.