wxWindows und ODBC



  • Ok, hoffentlich bin ich jetzt der allgemeinen Meinung nach in der richtigen Abteilung. Also hier nochmal meine Frage:

    Ich versuche gerade mit den ODBC-Klassen von wxWindows eine kleine Datenbankanwendung zu schreiben. Die Datenbankverbindung wird auch ohne Murren hergestellt und auch die Anfrage (per wxDb::ExecSql) wird ausgeführt (zumindest liefert ExecSql true). Auch GetNext() haut anscheinend noch hin, weil die Methode true zurückgibt. Dann versuchte ich mal testweise den Wert einer Spalte abzufragen, was allerdings nicht funktionierte. Mein Code dazu sieht folgendermaßen aus (verkürzte Form ohne Fehlerbehandlung):

    SDWORD cb; 
    wxString reqQty; 
    
    hsDB->ExecSql("SELECT * FROM eineTabelle"); 
    
    hsDB->GetNext(); 
    
    hsDB->GetData(2, SQL_C_CHAR, &reqQty, 0, &cb);
    

    Der letzte Aufruf gibt halt jetzt immer false zurück. Kennt jemand eine Möglichkeit, wie man an die Information kommen könnte, was genau jetzt hier schiefläuft?



  • bist du dir sicher das execsql ne rückgabemenge hat ?
    ich bin mir ziemlich sicher das es das net hat und nur aktualisierungs oder lösch oder einfüg abfragen durchreicht.

    versuch ma open ..



  • Das mit der Rückgabemenge empfinde ich gerade als das große Problem bei diesem ODBC-Zeugs von Windows. Ich bin eigentlich eher in der JDBC-Welt zu Hause und daher gewöhnt, dass die Methoden schöne ResultSets zurückgeben, die man dann durchlaufen kann. Aber bei wxWindows geben alle Methoden nur bool zurück. Derjenige, der das programmiert hat, fühlte sich wohl noch nostalgischerweise an die alten imperativen Zeiten gebunden. Mit Objektorientiertheit hat das sehr wenig zu tun. Doch nun zu Deinem Vorschlag:

    Die Methode wxDb::open() ist ja dazu da, die Datenbankverbindung zu öffnen. Alternativ kann man aber auch die Methode wxDbGetConnection(wxDbConnectInf* connectInf) aufrufen, zumindest hab ich das so verstanden. Ich stütz mich da auf die Doku von wxWindows, die ich im Übrigen im Vergleich zur Java-Api-Doku ganz schön armselig finde. Das Problem mit der open-Methode ist bei mir, dass ich da ständig einen Speicherfehler in der ODBC32.DLL bekomme und nicht weiß, wie ich das beheben soll. Mit den ge-cache-ten Verbindungen, die man mit wxDbGetConnection() bekommt scheints aber zu klappen. Zumindest haut dann der Aufruf von ExecSql() hin, der ohne eine offene Verbindung auch einen Speicher verursacht.

    Laut Doku soll man ja nun, nachdem man ExeSql() aufgerufen hat (was übrigens bei mir true liefert, also praktisch Erfolg meldet), nun GetNext() aufrufen kann, damit der CURSOR zum nächsten Datensatz springt (liefert ebefalls true). Danach muss man dann eben mit mehreren Aufrufen von GetData() die Werte der einzelnen Spalten rauspicken. Das gibt halt bei mir jetzt immer false zurück und ich hab keine Ahnung warum.


Anmelden zum Antworten