Seite 1 von 1

Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 8. November 2018 08:56
von Matti1104
Hallo,

ich möchte gerne Daten aus einer Tabelle einer SQL-Server Datenbank in einem QTableView ausgeben.
Dazu nutze ich den folgenden Code:

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
db.setDatabaseName("DRIVER={SQL Server};Server=Localhost;Database=dbName;Uid=sa;Port=1433;Pwd=***;WSID=.");
db.open();

QSqlQueryModel *model = new QSqlQueryModel;

QSqlQuery* query = new QSqlQuery(db);
query->prepare("select top 2 * from Rail");

model->setQuery(*query);
ui->tableView->setModel(model);
Die Abfrage funktioniert, das QTableView zeigt die Namen der Datenfelder an und die richtige Zeilenanzahl wird auch ausgegeben.
Allerdings enthalten die Zellen anscheinend keinerlei Werte oder diese werden nicht angezeigt.

Kennt jemand das Problem und weiss evtuell jemand woran das liegen kann?

Ich nutze den QT Creator 4.7.1 und QT 5.11.2.

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 8. November 2018 21:01
von Christian81
Mal mit 'model.setQuery("select * from Rail");' probiert?

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 8. November 2018 21:41
von Husi
Bin gerade Interessanterweise auf das selbe Problem gestoßen und habe deinen Vorschlag mal fix getestet. Macht leider keinen Unterschied.

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 8. November 2018 22:34
von Matti1104
Dann handelt es hier anscheinend um einen Bug im aktuellen QT.

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 9. November 2018 22:04
von Husi
Möglich.
Welche Datenbank nutzt du denn?
Ich greife auf einen MS-SQL Server via ODBC Treiber zu.
Vllt hängt es ja damit zusammen?

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 10. November 2018 09:50
von Husi
Ich hab gerade das ganze nochmal mit dem QSqlTableModel getestet. Bringt aber leider das selbe Ergebnis.
Hab mein Programm außerdem gerade mal auf eine MySQL Datenbank umgeschrieben und siehe da. Es Funktioniert. Sowohl mit Query als auch mit dem Table Model. Allerdings bin ich für die finale Version leider an eine MS-SQL Db gebunden.
Hat noch jemand eine Idee warum sich der Microsoftserver beziehungsweise der ODBC3 Treiber bei dem Zugriff über das Model Querstellen könnte?
Normaler zugriff über eine Query funktioniert tadellos...

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 10. November 2018 10:28
von Christian81
Also muss es irgend eine Einstellung im ODBC-Treiber sein (z.B. forward only queries oder sonstwas) und hat nichts mit Qt zu tun.

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 10. November 2018 11:10
von Husi
Ja ich vermutete was ähnliches. Hab zum testen mal das mitgelieferte SQL-Browser Beispiel mit meiner DB verbunden. Damit wird das TableView schön mit Daten gefüllt. Also mal nach Unterschieden gesucht und auch einen gefunden. In meinem Code habe ich nach Verlinkung des Views mit dem Model die Datenbankverbindung wieder geschlossen. So wie es sich für mich auch eigentlich gehört wenn alle Daten vermeidlich gelesen wurden. Das passiert im Beispiel nicht.

Code: Alles auswählen

QSqlTableModel* model = new QSqlTableModel(ui->tabErgebniss,*db);
    db->open();
    model->setTable("messungen");
    model->select();
    ui->tabErgebniss->setModel(model);
    ui->tabErgebniss->show();
    (*mydebug)<<model->lastError().text()<<myendl;
    db->close();
Ohne die close() Funktion läuft es auch mit dem SQL Server. Die My-SQL-Datenbank scheint das nicht zu stören.
Bleibt für mich noch eine Frage offen. Eigentlich ist es doch nicht die klügste Idee eine Datenbankverbindung dauerhaft geöffnet zu lassen oder macht das in diesem Fall keine weiteren Probleme wenn ich die Verbindung im D'tor wieder schieße?

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 10. November 2018 12:02
von Matti1104
Ah alles klar, dann liegt es einfach nur am Schließen der DB Verbindung. Das klingt absolut plausibel. Alles besten Dank für diesen top. Das ist nämlich bei der VCL vom C++ Builder oder bei C# mit .NET genauso. Warum bin ich nicht selbst darauf gekommen?
Also muss bei der Ausgabe auf ein TableView einfach dir Verbindung aufrecht erhalten werden ...
Aber schon komisch wie das der MySQL Treiber dann realisiet, das die Daten trotz geschlossener DB im Query erhalten bleiben..

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Verfasst: 10. November 2018 12:11
von Husi
Ja das freut mich, dass die Lösung auch bei dir Funktioniert ;)
Danke auch an dich Christian für die Denkanstöße.

Kann mir denn, da wir das Problem jetzt gelöst haben, einer von euch beiden einen Tipp zu meiner Programmstruckturierung geben? Da sitze ich jetzt schon seit 2 Wochen dranne und komme auf keinen grünen Ast...
Siehe Post in diesem Forum "Struktureller Aufbau und Schachtelung von Klassen" Ihr wärt mir echt eine Hilfe.