Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

ExecuteSQL() wird nicht ausgeführt

Empfohlene Antworten

Veröffentlicht

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

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?

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

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

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.

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.