Hallo, ich versuche mich gerade an einem ersten QT-Datenbank-Programm. Ich verbinde mich über ODBC an die DB und versuche ein einfaches select abzusetzen und mir die Daten anzeigen zu lassen. Soweit so gut, aber nach Ausführen des Select's bekomme ich keine Daten, obwohl angeblich über 5000 Datensätze "affected" sind. query.at() liefert mir stets "-1", auch nach einem query.first(). Warum sagt mir query.isValid() "false", bzw. was genau sagt das aus ? Die Datenbank ist ordnungsgemäß geöffnet und die Query wurde problemlos ausgeführt (query.isActive() = true). code: .... if ( defaultDB->open() ) { QSqlQuery query = defaultDB->exec( "SELECT id, name FROM company"); qDebug("no. of affected rows: %d, isValid ? %d, isActive ? %d", query.numRowsAffected(), query.isValid(), query.isActive()); if ( query.isActive() ) { query.first(); qDebug("query is active, at: %d", query.at()); while ( query.next() ) { qDebug("ID:%d, name:%s",query.value(0), query.value(1) ); } } QMessageBox::about( this, tr("id, name"),qstr); } .... für jede Hilfe dankbar.....GERD....
Am 1 Jun 2005 um 11:13 hat Gerd König geschrieben:
Hallo,
ich versuche mich gerade an einem ersten QT-Datenbank-Programm. Ich verbinde mich über ODBC an die DB und versuche ein einfaches select abzusetzen und mir die Daten anzeigen zu lassen.
Soweit so gut, aber nach Ausführen des Select's bekomme ich keine Daten, obwohl angeblich über 5000 Datensätze "affected" sind. query.at() liefert mir stets "-1", auch nach einem query.first().
Warum sagt mir query.isValid() "false", bzw. was genau sagt das aus ?
Die Datenbank ist ordnungsgemäß geöffnet und die Query wurde problemlos ausgeführt (query.isActive() = true).
Ich denke, die Daten werden auch angezeigt... Wenn ja, denke ich, dass isValid erst true zurück gibt, wenn auch zu einem Datensatz gegangen wird (next/first/last/...) Setze die erste qDebug Zeile hinter query.first(). Lothar PS. Bin kein QT Programmierer :-)
code: .... if ( defaultDB->open() ) { QSqlQuery query = defaultDB->exec( "SELECT id, name FROM company"); qDebug("no. of affected rows: %d, isValid ? %d, isActive ? %d", query.numRowsAffected(), query.isValid(), query.isActive()); if ( query.isActive() ) { query.first(); qDebug("query is active, at: %d", query.at()); while ( query.next() ) { qDebug("ID:%d, name:%s",query.value(0), query.value(1) );
} } QMessageBox::about( this, tr("id, name"),qstr); } ....
für jede Hilfe dankbar.....GERD....
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-programming-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-programming-help@suse.com
-- Lothar Behrens | Rapid Prototyping ... Rosmarinstr 3 | 40235 Düsseldorf | www.lollisoft.de
Hi Lothar, danke für die Antwort. Leider ist es nicht die Lösung des Problems, denn nach dem .first()-Aufruf ist der Status nach wie vor invalid und .at() liefert "-1". so what ?? --GERD-- lothar.behrens@lollisoft.de schrieb:
Am 1 Jun 2005 um 11:13 hat Gerd König geschrieben:
Hallo,
ich versuche mich gerade an einem ersten QT-Datenbank-Programm. Ich verbinde mich über ODBC an die DB und versuche ein einfaches select abzusetzen und mir die Daten anzeigen zu lassen.
Soweit so gut, aber nach Ausführen des Select's bekomme ich keine Daten, obwohl angeblich über 5000 Datensätze "affected" sind. query.at() liefert mir stets "-1", auch nach einem query.first().
Warum sagt mir query.isValid() "false", bzw. was genau sagt das aus ?
Die Datenbank ist ordnungsgemäß geöffnet und die Query wurde problemlos ausgeführt (query.isActive() = true).
Ich denke, die Daten werden auch angezeigt...
Wenn ja, denke ich, dass isValid erst true zurück gibt, wenn auch zu einem Datensatz gegangen wird (next/first/last/...)
Setze die erste qDebug Zeile hinter query.first().
Lothar
PS. Bin kein QT Programmierer :-)
code: .... if ( defaultDB->open() ) { QSqlQuery query = defaultDB->exec( "SELECT id, name FROM company"); qDebug("no. of affected rows: %d, isValid ? %d, isActive ? %d", query.numRowsAffected(), query.isValid(), query.isActive()); if ( query.isActive() ) { query.first(); qDebug("query is active, at: %d", query.at()); while ( query.next() ) { qDebug("ID:%d, name:%s",query.value(0), query.value(1) );
} } QMessageBox::about( this, tr("id, name"),qstr); } ....
für jede Hilfe dankbar.....GERD....
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-programming-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-programming-help@suse.com
Hallo Am Wednesday, 1. June 2005 11:13 schrieb Gerd König:
Hallo,
ich versuche mich gerade an einem ersten QT-Datenbank-Programm. Ich verbinde mich über ODBC an die DB und versuche ein einfaches select abzusetzen und mir die Daten anzeigen zu lassen.
Soweit so gut, aber nach Ausführen des Select's bekomme ich keine Daten, obwohl angeblich über 5000 Datensätze "affected" sind. Kann diese Anzahl stimmen? Mal auf einer Konsole gegen geprüft.?
query.at() liefert mir stets "-1", auch nach einem query.first().
Warum sagt mir query.isValid() "false", bzw. was genau sagt das aus ?
Die Datenbank ist ordnungsgemäß geöffnet und die Query wurde problemlos ausgeführt (query.isActive() = true).
code: .... if ( defaultDB->open() ) { QSqlQuery query = defaultDB->exec( "SELECT id, name FROM company");
Ich nehme an defaultDB->exec ist folgendes: QSqlQuery QSqlDatabase::exec ( const QString & query = QString::null ) const Executes a SQL statement (e.g. an INSERT, UPDATE or DELETE statement) on the database <<<< SELECT fehlt hier, vielleicht liegt da der Fehler Meines Wissens wird nach einem exec erstmal auf einen invalid Record gezeigt. Bevor man also weitermacht, sollte man ein query.next() aufrufen um zum ersten Datensatz zu springen.
qDebug("no. of affected rows: %d, isValid ? %d, isActive ? %d", query.numRowsAffected(), query.isValid(), query.isActive()); if ( query.isActive() ) { query.first(); qDebug("query is active, at: %d", query.at()); while ( query.next() ) { qDebug("ID:%d, name:%s",query.value(0), query.value(1) );
} } QMessageBox::about( this, tr("id, name"),qstr); } ....
für jede Hilfe dankbar.....GERD....
-- Thomas Wedehase Nuernberg, Germany www.thomaswedehase.com PGP-KEY: 0x3337F9AC
Hallo Thomas, vielen Dank für Deine Antwort. Leider bringen Deine Hinweise noch keine Verbesserung des Problems. Alternativ zur QSqlQuery habe ich jetzt mal einen QSqlCursor probiert, leider auch ohne Erfolg (s.u.). Thomas Wedehase schrieb:
Hallo
Am Wednesday, 1. June 2005 11:13 schrieb Gerd König:
Hallo,
ich versuche mich gerade an einem ersten QT-Datenbank-Programm. Ich verbinde mich über ODBC an die DB und versuche ein einfaches select abzusetzen und mir die Daten anzeigen zu lassen.
Soweit so gut, aber nach Ausführen des Select's bekomme ich keine Daten, obwohl angeblich über 5000 Datensätze "affected" sind.
Kann diese Anzahl stimmen? Mal auf einer Konsole gegen geprüft.?
Die Anzahl stimmt, es sollten wirklich so viele Einträge kommen.
query.at() liefert mir stets "-1", auch nach einem query.first().
Warum sagt mir query.isValid() "false", bzw. was genau sagt das aus ?
Die Datenbank ist ordnungsgemäß geöffnet und die Query wurde problemlos ausgeführt (query.isActive() = true).
code: .... if ( defaultDB->open() ) { QSqlQuery query = defaultDB->exec( "SELECT id, name FROM company");
Ich nehme an defaultDB->exec ist folgendes: QSqlQuery QSqlDatabase::exec ( const QString & query = QString::null ) const Executes a SQL statement (e.g. an INSERT, UPDATE or DELETE statement) on the database <<<< SELECT fehlt hier, vielleicht liegt da der Fehler
..das ist richtig. Jedoch habe ich die betreffenden Code-Zeilen aus der QT-Doku zu QSqlQuery kopiert (da war dies als Beispiel aufgeführt). Den Alternativweg über einen Cursor hat mich zu folgender Fehlermeldung gebracht: "QSqlCursor::setName: unable to build record, does 'company' exist ? " Code: QSqlCursor cur( "company" , TRUE, defaultDB); cur.select(); while ( cur.next() ) { qDebug( cur.value( "id" ).toString() + ": " + cur.value( "name" ).toString() ); }
Meines Wissens wird nach einem exec erstmal auf einen invalid Record gezeigt. Bevor man also weitermacht, sollte man ein query.next() aufrufen um zum ersten Datensatz zu springen.
qDebug("no. of affected rows: %d, isValid ? %d, isActive ? %d", query.numRowsAffected(), query.isValid(), query.isActive()); if ( query.isActive() ) { query.first(); qDebug("query is active, at: %d", query.at()); while ( query.next() ) { qDebug("ID:%d, name:%s",query.value(0), query.value(1) );
} } QMessageBox::about( this, tr("id, name"),qstr); } ....
für jede Hilfe dankbar.....GERD....
Hallo Also auskennen tue ich mich auch nicht.
QSqlQuery query = defaultDB->exec( "SELECT id, name FROM company"); Bei mir steht der Name der Tabelle immer in Hochkomma: QString sql = "SELECT count(Beoort) FROM `Funde` where Vogelnr = '";
Warum sagt mir query.isValid() "false", bzw. was genau sagt das aus ?
Zu query.first() steht in meinen Buch der Hinweis das diese Funktionen (last,prev,at,seek) auf einigen Db sehr langsam ausgeführt werden und manchmal zu echten Speicherfressern mutieren. direkt aus der Doku kopiert: ==== bool QSqlQuery::isValid () const Returns TRUE if the query is currently positioned on a valid record; otherwise returns FALSE. bool QSqlQuery::last () [virtual] Retrieves the last record in the result, if available, and positions the query on the retrieved record. Note that the result must be in an active state and isSelect() must return TRUE before calling this function or it will do nothing and return FALSE. Returns TRUE if successful. If unsuccessful the query position is set to an invalid position and FALSE is returned. ==== Was sagt denn isSelect() bei Dir? Auf alle Fälle gibt es die Möglichkeit das der Datensatzzeiger nicht ordnungsgemäß positioniert ist. Vielleicht sind 5000 Datensätze ja auch irgendwie "zu groß". Teste doch mal eine Abfrage die weniger Daten liefert. Oder verändere zu Testzwecken die Abfrage. z.B. in "SELECT * FROM company" Welche Db steht denn hinter ODBC? Wenn es Access ist würde ich mich nicht wundern. Access führt oft ein "Eigenleben". Zu meinen MS-Zeiten bekam ich erst nach einen move.last und move.first korrekte Abfrageergebnisse. Bei Linux allgemein ist die korrekte Groß/Kleinschreibung sehr wichtig. kann man die Abfrage direkt auf der Db testen oder von einen anderen Programm aus? mfg
Hallo, hab Deine Hinweise gleich mal getestet, doch leider ohne irgendwie zum Ziel zu kommen: suseliste@wolke7.net schrieb:
Hallo
Was sagt denn isSelect() bei Dir?
isSelect() liefert "1"
Auf alle Fälle gibt es die Möglichkeit das der Datensatzzeiger nicht ordnungsgemäß positioniert ist.
Vielleicht sind 5000 Datensätze ja auch irgendwie "zu groß". Teste doch mal eine Abfrage die weniger Daten liefert. Oder verändere zu Testzwecken die Abfrage. z.B. in "SELECT * FROM company"
Ich hab's mal mit "select id, name from company where id=12345" getestet. Korrekterweise ist dann numberOfAffectedRows == 1 aber die Daten kommen trotzdem nicht.
Welche Db steht denn hinter ODBC? Wenn es Access ist würde ich mich nicht wundern. Access führt oft ein "Eigenleben". Zu meinen MS-Zeiten bekam ich erst nach einen move.last und move.first korrekte Abfrageergebnisse.
Die benutzte Datenbank ist eine SapDB 7.3. Über das SQLStudio (Tool der SapDB) lässt sich die Abfrage problemlos absetzen.
Bei Linux allgemein ist die korrekte Groß/Kleinschreibung sehr wichtig.
kann man die Abfrage direkt auf der Db testen oder von einen anderen Programm aus?
weiterhin für jeden Hinweis dankbar....GERD....
Hallo Am Wednesday, 1. June 2005 11:13 schrieb Gerd König:
Hallo,
ich versuche mich gerade an einem ersten QT-Datenbank-Programm. Ich verbinde mich über ODBC an die DB und versuche ein einfaches select abzusetzen und mir die Daten anzeigen zu lassen.
Soweit so gut, aber nach Ausführen des Select's bekomme ich keine Daten, obwohl angeblich über 5000 Datensätze "affected" sind. query.at() liefert mir stets "-1", auch nach einem query.first().
Warum sagt mir query.isValid() "false", bzw. was genau sagt das aus ?
Die Datenbank ist ordnungsgemäß geöffnet und die Query wurde problemlos ausgeführt (query.isActive() = true).
noch ein Vorschlag: Versuch doch einfach mal Text auf ein Label zu geben und gib das Label mal aus (nur ein Versuch, da ich auch bald keine Ideen mehr habe :)) QLabel *testLabel = new QLabel(query.value("test").toString(), this); oder so ähnlich, musst du noch anpassen
code: .... if ( defaultDB->open() ) { QSqlQuery query = defaultDB->exec( "SELECT id, name FROM company"); qDebug("no. of affected rows: %d, isValid ? %d, isActive ? %d", query.numRowsAffected(), query.isValid(), query.isActive()); if ( query.isActive() ) { query.first(); qDebug("query is active, at: %d", query.at()); while ( query.next() ) { qDebug("ID:%d, name:%s",query.value(0), query.value(1) ); ^^^^^ Vielleicht musst du auch hier noch ein .toString anhänge, da %s einen String verlangt.
} } QMessageBox::about( this, tr("id, name"),qstr); } ....
für jede Hilfe dankbar.....GERD....
Gruß Thomas -- Thomas Wedehase Nuernberg, Germany www.thomaswedehase.com PGP-KEY: 0x3337F9AC
qDebug("ID:%d, name:%s",query.value(0), query.value(1) );
^^^^^ Vielleicht musst du auch hier noch ein .toString anhänge, da %s einen String verlangt.
Ist wirklich nötig. Denn woher soll query.value(x) wissen, was für ein Typ zurück gegeben werden soll. Es kann nur einen Standart Rückgabetyp für value geben. Auch wenn es mehrere value(x) Implementationen gibt, bei einem Vararg kann der Compiler nicht mehr wissen, was für ein Typ benötigt wird. Diese Vararg's können auch zu hässlichen Fehlern führen. Lothar
} } QMessageBox::about( this, tr("id, name"),qstr); } ....
für jede Hilfe dankbar.....GERD....
Gruß Thomas
-- Thomas Wedehase Nuernberg, Germany www.thomaswedehase.com PGP-KEY: 0x3337F9AC
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-programming-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-programming-help@suse.com
-- Lothar Behrens | Rapid Prototyping ... Rosmarinstr 3 | 40235 Düsseldorf | www.lollisoft.de
On 02.06.2005 21:50, lothar.behrens@lollisoft.de wrote:
Es kann nur einen Standart Rückgabetyp für value geben. ^^^^^^^^ http://de.wikipedia.org/w/index.php?title=Standart&direction=prev&oldid=6060708
;-) SCNR, Oliver
Hallo miteinander, leider besteht das Problem immer noch. Die Hinweise wegen dem .toString() sind zwar richtig, doch bis dahin kommt mein Programm ja nicht mal => s.u. Kann das Problem mit ODBC + SapDB zusammenhängen, der Programmcode ist ja aus der Doku kopiert und da denke ich wurde er getestet ? Thomas Wedehase schrieb:
Hallo Am Wednesday, 1. June 2005 11:13 schrieb Gerd König:
Hallo,
if ( defaultDB->open() ) { QSqlQuery query = defaultDB->exec( "SELECT id, name FROM company"); qDebug("no. of affected rows: %d, isValid ? %d, isActive ? %d", query.numRowsAffected(), query.isValid(), query.isActive()); if ( query.isActive() ) { query.first(); qDebug("query is active, at: %d", query.at()); while ( query.next() ) { qDebug("ID:%d, name:%s",query.value(0), query.value(1) );
^^^^^ Vielleicht musst du auch hier noch ein .toString anhänge, da %s einen String verlangt.
Ich hab's mal einfacher getestet: ....->exec("SELECT id from company"); .... .... ....qDebug("ID:%d", query.value(0)); Weil jedoch die query invalid ist komme ich gar nie in die while-Schleife rein (query.next() ist immer false). Aus der Doku zu query.next() entnehme ich somit, daß die Datensätze nicht abgerufen werden können, da .isActive() und .isSelect() beide "true" liefern. ....?? --GERD--
Am 3 Jun 2005 um 8:15 hat Gerd König geschrieben:
Hallo miteinander,
leider besteht das Problem immer noch. Die Hinweise wegen dem .toString() sind zwar richtig, doch bis dahin kommt mein Programm ja nicht mal => s.u.
Kann das Problem mit ODBC + SapDB zusammenhängen, der Programmcode ist ja aus der Doku kopiert und da denke ich wurde er getestet ?
Naja, wenn das Programm wirklich aus der Doku kopiert ist. Man kann sich ja den Wolf im Programm suchen, wenn man glaubt, es läge am Programm. 1. Teste mit einem anderen *ODBC* basierten Programm. 2. Verwende eine andere Datenbank. Z.B. PostgreSQL Wenn ausserhalb des Programms Probleme sind, kann es sein, dass sich das Programm garnicht mehr so verhält wie es soll. E.g. ein Beispiel fängt meistens nicht alle Fehler ab! 3. Verwende zur Not einen Netzwerk Sniffer oder schalte das Logging des ODBC Treibers ein um zu sehen wo es klemmt. Lothar -- Lothar Behrens | Rapid Prototyping ... Rosmarinstr 3 | 40235 Düsseldorf | www.lollisoft.de
participants (5)
-
Gerd König
-
lothar.behrens@lollisoft.de
-
Oliver Baum
-
suseliste@wolke7.net
-
Thomas Wedehase