Problem bei ODBC



  • Hallo,

    habe ein Problem bei einer selbst erstellten Klasse:

    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);
    
    	SQLFetch(hstmt);
    	//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);
    
    }
    

    Mein Problem ist es, wenn ich von der Methode Search in SearchinSensorforDate()
    auf die MoveNextSet() funktioniert es das er die nächste Zeile nimmt. Aber wenn
    ich von aussen auf die Funktion zugreifen:

    ODBCZugriff test;
    test.SearchinSensorforDate("1999-12-12");
    test.MoveNextSet();
    

    klappts komischer weise nicht mehr.

    Ich kriege dann die Fehlermeldung:

    Unbehandelte Ausnahme in ODBC Klasse.exe (MYODBC3.DLL): 0:C0000005: Access Violation.

    Mir ist aber aufgefallen wenn ich das
    SQL Statement auf "SELECT * FROM sensoren" klappt alles. Die Datenbank enthällt auch mehere Einträge die auf diese Statements zutrifft.

    Vielen Dank für eure Tipps.



  • was steht denn in Befehl drin wenn du im Debug Modus die Variable anschaust??

    Wenn das alles in Ordnung ist, solltest du mal die Fehlermeldung mit Try und Catch abfangen um genauere Informationen zu erhalten, wo das Problem liegt



  • Soweit ich mich erinnern kann, benutzt SQL als Anführungszeichen die einfachen, nicht die doppelten.
    Probier es mal mit:

    lstrcat(befehl, "'"); 
        lstrcat(befehl, suche); 
        lstrcat(befehl, "'");
    


  • danke für eure Hinweise.

    Ich habe jetzt das SQL Statement modifiziert, funktioniert auch, aber klappt
    immer noch nicht.Habe erstmal folgendes versucht:

    ODBCZugriff *test = new ODBCZugriff;
    test->SearchinSensorforDate("1999-12-12");
    test->MoveNextSet();
    delete test;
    

    Ich dachte es könnte eventuell am Speicher liegen!



  • Der zweite Parameter von SQLBindCol(...) ist nur richtig, wenn das SQL_ATTR_USE_BOOKMARKS Statement auf SQL_UB_OFF gesetzt ist. Ansonsten stertet der Index bei 0. Könnte ja vielleicht auch daran liegen...



  • ist deine Datumsangabe auf dem Server so wie du suchst? Oder lässt du es dir in deinem Programm nur so anzeigen? Stimmt das Datumsformat ganz sicher mit dem vom Server überein???



  • Das SQLBindCol schein ganz gut zu funktionieren( glaube ich )! Aber es wundert mich das ich nicht über die Intanz auf die Methode zugreifen kann.

    Ja, mit dem Datum ist das so eine Sache, eigentlich ist es keines, es ist nur
    ein VARCHAR auf dem Server, will es erstmal so versuchen.



  • Fehlt dir bei der Instanz vielleicht irgendwo ein Open() oder Requery() ?



  • mmh, gut Frage! 🙂
    hab ich nix von eingefügt, wie meinst du das?



  • Bei Benutzung von CRecordset oder CDatabase usw. muss die Datenbank/Tabelle mit Open() geöffnet werden. Nach Änderung eines Filters oder ähnlichem muss eine bereits geöffnete Tabelle mit Requery() aktualisiert werden, damit die entsprechenden Datensätze geladen werden.

    Mit SQLBindCol(..) habe ich allerdings noch nix gemacht. War nur so eine Idee. Anscheinend ist aber das SQLFetch(...) so etwas ähnliches...

    Hast du eigentlich mehrere Datensätze mit dem Kriterium "1999-12-12" ? Ich weiss ja jetzt nicht, wie der aktuelle Quellcode-Stand ist, aber da oben hast du ein SQLFetch(...) in SearchinSensorforDate(...) und ein SQLFetch(...) in MoveNextSet(). Rennt er da schon ins Leere ?

    Mmmhhh,... mehr fällt mir jetzt nicht ein...



  • Hi, ach so meinst du das.
    Ja, bei CRecordset ist das so. Ich habe in diesem Beispiel ohne diese Beiden
    Klasse gearbeitet. Desshalb habe ich es mit der sql.h bzw odbc23.dll gemacht.

    Ja mit dem ins leere laufen habe ich das mit einem RETCODE abgefangen und
    das funktioniert auch. naja nur wenn ich innerhalb der Klasse auf MoveNextSet(); zugreife.


Anmelden zum Antworten