Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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?

Geschrieben

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

Geschrieben
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?
Geschrieben
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.

Geschrieben

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.

Geschrieben
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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...