Nospherates
Erfahrenes Mitglied
Hallo zusammen!
Im Zuge eines Datenbankwechsels von mySQL nach Oracle musste auch eine C- Anwendung umgeschrieben werden. Unter mySQL lief soweit alles problemlos, seitdem nun OCCI mit eingebunden wurde stürzt das Programm mehr oder minder regelmäßig ab. Ich konnte das zumindest soweit eingrenzen, dass ich IN ETWA die Stelle abstecken kann wo es passiert. Allerdings wirkt es trotzdem manchmal willkürlich, weil die Stelle des Absturzes etwas variiert. Es passiert aber immer im selben Abschnitt des Programms.
Die Funktion führt eine simple Select Anweisung aus und soll die Ergebnisse anschließend in einen vector schreiben. Das klapp grundsätzlich auch, allerdings stürzt das Programm meistens "string value=rs->getString(i);" (Zeile 20) an dieser Stelle ab. Jedoch nicht direkt beim ersten Schleifendurchgang, sondern eher beim letzten. Zwischendurch ist er mir auch mal abgeschmiert wenn das Resultset durchgelaufen ist, aber bevor er die Schleife verlässt.
Ich hab keine Ahnung mehr wo ich noch ansetzen soll, der Try-catch Block greift auch nicht, so dass ich keine Auskunft erhalte was da eigentlich schief läuft. Ich bezweifel, dass mir jemand direkt eine Lösung nennen kann, aber hat vielleicht noch jemand eine Ahnung was für Fehler man noch abfangen könnte, so dass ich zumindest mal eine Meldung erhalte?!
Für mich sieht es entweder nach einem Speicherproblem oder einem Verbindungsproblem aus, vor allem weil bei mehrfachen Start der Anwendung es irgendwann auch einmal durchläuft.
Vielen Dank schonmal....
Der Code der Funktion sieht wie folgt aus:
Im Zuge eines Datenbankwechsels von mySQL nach Oracle musste auch eine C- Anwendung umgeschrieben werden. Unter mySQL lief soweit alles problemlos, seitdem nun OCCI mit eingebunden wurde stürzt das Programm mehr oder minder regelmäßig ab. Ich konnte das zumindest soweit eingrenzen, dass ich IN ETWA die Stelle abstecken kann wo es passiert. Allerdings wirkt es trotzdem manchmal willkürlich, weil die Stelle des Absturzes etwas variiert. Es passiert aber immer im selben Abschnitt des Programms.
Die Funktion führt eine simple Select Anweisung aus und soll die Ergebnisse anschließend in einen vector schreiben. Das klapp grundsätzlich auch, allerdings stürzt das Programm meistens "string value=rs->getString(i);" (Zeile 20) an dieser Stelle ab. Jedoch nicht direkt beim ersten Schleifendurchgang, sondern eher beim letzten. Zwischendurch ist er mir auch mal abgeschmiert wenn das Resultset durchgelaufen ist, aber bevor er die Schleife verlässt.
Ich hab keine Ahnung mehr wo ich noch ansetzen soll, der Try-catch Block greift auch nicht, so dass ich keine Auskunft erhalte was da eigentlich schief läuft. Ich bezweifel, dass mir jemand direkt eine Lösung nennen kann, aber hat vielleicht noch jemand eine Ahnung was für Fehler man noch abfangen könnte, so dass ich zumindest mal eine Meldung erhalte?!
Für mich sieht es entweder nach einem Speicherproblem oder einem Verbindungsproblem aus, vor allem weil bei mehrfachen Start der Anwendung es irgendwann auch einmal durchläuft.
Vielen Dank schonmal....
Der Code der Funktion sieht wie folgt aus:
Code:
BOOL CoraDB::getValues(CString query, int col, std::vector<CString>& vecReturn){
myFunctions.createLogEntry("Try: "+query,0,3);
BOOL isOk=FALSE, isEmpty=TRUE;
ResultSet* rs;
Statement* stmt;
CT2CA pszConvertedAnsiString (query);
std::string stdquery (pszConvertedAnsiString);
stmt = conn->createStatement();
stmt->setSQL(stdquery);
try{
rs = stmt->executeQuery();
cout <<" Results: " <<rs->getNumArrayRows() << " / cols: " << myFunctions.getNumAsText(col) << endl;
while (rs->next() ){
myFunctions.createLogEntry("Before for",0,5);
for (int i = 1; i <= col; i++){
isEmpty=FALSE;
isOk=FALSE;
myFunctions.createLogEntry("Before getString",0,5);
string value=rs->getString(i);
myFunctions.createLogEntry("After getString",0,5);
vecReturn.push_back(value.c_str());
myFunctions.createLogEntry("Value pushed "0,5);
isOk=TRUE;
myFunctions.createLogEntry("isOk",0,5);
}//for
myFunctions.createLogEntry("After for",0,5);
}//while
//rs->cancel();
myFunctions.createLogEntry("Succeed: "+query,0,3);
stmt->closeResultSet(rs);
conn->terminateStatement(stmt);
if (isOk || isEmpty)
return TRUE;
else{
myFunctions.createLogEntry("Es ist ein unbekannter Fehler (CoraDB::getValues() aufgetreten!");
return FALSE;
}
return TRUE;
}
catch (SQLException &e){
myFunctions.createLogEntry("Es ist ein SQLFehler (CoraDB::getValues() aufgetreten! " + e.getErrorCode());
return FALSE;
}catch (exception &ex){
CString cstError=ex.what();
myFunctions.createLogEntry(_T("Es ist ein Fehler (CoraDB::getValues() aufgetreten! ") +cstError );
return FALSE;
}
return FALSE;
}