SQLFetch führt zu Access Violation
-
Hallo,
ich habe schon seit längerem das Problem mit einer Klasse.
In der Klasse wird die Funktion SQLFetch() aufgerufen.
Wenn die Klasse die Funtion aufruft gibt es keine Fehler, aber sobald
ich von aussen über die Instanz darauf zugreife führt es zu einer
"Access Violation". Ich poste hier mal meinen Sourcecode:void ODBCZugriff::SearchinSensorforDate(char suche[30]) { char befehl[80]="SELECT * FROM sensoren WHERE Datum="; lstrcat(befehl, "\""); lstrcat(befehl, suche); lstrcat(befehl, "\""); SQLExecDirect(hstmt,(UCHAR FAR *) befehl, SQL_NTS); SDWORD var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11; SQLBindCol(hstmt, 1, SQL_C_DOUBLE, (PTR)&sen[0], sizeof(sen[0]), &var1); SQLBindCol(hstmt, 2, SQL_C_DOUBLE, (PTR)&sen[1], sizeof(sen[1]), &var2); SQLBindCol(hstmt, 3, SQL_C_DOUBLE, (PTR)&sen[2], sizeof(sen[2]), &var3); SQLBindCol(hstmt, 4, SQL_C_DOUBLE, (PTR)&sen[3], sizeof(sen[3]), &var4); SQLBindCol(hstmt, 5, SQL_C_DOUBLE, (PTR)&sen[4], sizeof(sen[4]), &var5); SQLBindCol(hstmt, 6, SQL_C_DOUBLE, (PTR)&sen[5], sizeof(sen[5]), &var6); SQLBindCol(hstmt, 7, SQL_C_DOUBLE, (PTR)&sen[6], sizeof(sen[6]), &var7); SQLBindCol(hstmt, 8, SQL_C_DOUBLE, (PTR)&sen[7], sizeof(sen[7]), &var8); SQLBindCol(hstmt, 9, SQL_C_SLONG, (PTR)&geraeteID, sizeof(geraeteID), &var9); SQLBindCol(hstmt, 10, SQL_C_CHAR, time, 20, &var10); SQLBindCol(hstmt, 11, SQL_C_CHAR, date, 20, &var11); MoveNextSet(); } void ODBCZugriff::MoveNextSet() { retcode = SQLFetch(hstmt); if (retcode == SQL_NO_DATA_FOUND) MessageBox(NULL,"Kein weiterer Datensatz in der aktuellen Datenbank gefunden!","DATENBANK",MB_OK); }
Von aussen greife ich so zu:
ODBCZugriff test; test.SearchinSensorforDate("1999-12-12"); test.MoveNextSet();
Wenn ich das Programm nochmal laufen lasse stürzt es ab, von wegen Windows Problembericht senden. Und wenn ich in den Debug Modus gehe bekomme ich die
Fehlermeldung:Unbehandelte Ausnahme in ODBC Klasse.exe (MYODBC3.DLL): 0:C0000005: Access Violation.
Ich habe schon bei google gesucht nach "SQLFetch "access violation"" und teilweise gelesen das es sich um ein Bug handelt.
Aber vielleicht habe ich auch einige Befehle wie z.b. SQLFreeStmt oder SQLEndtrans nicht richtig eingesetzt.
Vielen Dank für eure Hilfe.
-Gruss Patrick
-
gleiches Problem wie in deinem letzten Thread?
Fang doch bitte mal die Exception ab und schau was da drin steht, sollte dann eigentlich mehr Infos ergeben und somit die Suche ungemein vereinfachen!
-
ja, leider
ehrlich gesagt verstehe ich NULL von
try{} und Catch{}.
Was für ein Exception Handling muss ich den da abfangen? Kannst du mir da
helfen?
-
Hast du es schon mal mit der herkömmlichen Fehlerauswertung versucht? Lies mal: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcsqlexecdirect.asp
Und dann guck doch bitte mal, bei welchem Befehl die Exception geworfen wird. Also: Breakpoint setzen und Schritt für Schritt rantasten.
-
Hi,
die Fehlermeldung kommt genau nach dem Ausführen von der Funktion SQLFetch()
-
Tja, solange du keine Ahnung hast, was du fangen musst, ginge nur:
void ODBCZugriff::MoveNextSet() { try { retcode = SQLFetch(hstmt); catch (...) { AfxMessageBox("Fehler :("); } if (retcode == SQL_NO_DATA_FOUND) MessageBox(NULL,"Kein weiterer Datensatz in der aktuellen Datenbank gefunden!","DATENBANK",MB_OK); } }
Das hilft dir aber nicht wirklich weiter, weil es den Fehler nicht behebt.
Von so direkter ODBC Programmierung habe ich leider auch keine Ahnung.Aber wenn du rausfindest, was da geworfen wird, dann zeige ich dir, wie du das fangen musst.
Hast du dich denn schon da durch gekämpft?Edit: So isses besser...
-
dank dir, in das Kapitel habe ich mich schon eingelesen. Aber die Lösung für das Problem noch nicht gefunden. Was meinst du da was geworfen wird? Die Errorcodes?
-
Nein, Errorcodes werden nicht geworfen sondern zurückgegeben. Exceptions werden geworfen, das steht dann auch in der MSDN drin.
Die Errorcodes musst du mit einer switch verarbeiten.Es gibt auch Exceptions, die man nicht fangen kann - ich weiß nicht, ob diese dazu gehört.
-
achso,OK, danke, werde mich in das Thema dann mal in der MSDN einlesen