Datenbankausgabe über ein QTableView zeigt keine Werte an

Alles rund um die Programmierung mit Qt
Antworten
Matti1104
Beiträge: 4
Registriert: 7. November 2018 16:01

Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Matti1104 » 8. November 2018 08:56

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.
Dateianhänge
2018-11-08.png
2018-11-08.png (10.15 KiB) 184 mal betrachtet
Zuletzt geändert von Matti1104 am 8. November 2018 22:57, insgesamt 1-mal geändert.

Christian81
Beiträge: 7274
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Christian81 » 8. November 2018 21:01

Mal mit 'model.setQuery("select * from Rail");' probiert?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

Husi
Beiträge: 6
Registriert: 29. Oktober 2018 19:07
Wohnort: Enger

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Husi » 8. November 2018 21:41

Bin gerade Interessanterweise auf das selbe Problem gestoßen und habe deinen Vorschlag mal fix getestet. Macht leider keinen Unterschied.

Matti1104
Beiträge: 4
Registriert: 7. November 2018 16:01

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Matti1104 » 8. November 2018 22:34

Dann handelt es hier anscheinend um einen Bug im aktuellen QT.

Husi
Beiträge: 6
Registriert: 29. Oktober 2018 19:07
Wohnort: Enger

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Husi » 9. November 2018 22:04

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?

Husi
Beiträge: 6
Registriert: 29. Oktober 2018 19:07
Wohnort: Enger

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Husi » 10. November 2018 09:50

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...

Christian81
Beiträge: 7274
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Christian81 » 10. November 2018 10:28

Also muss es irgend eine Einstellung im ODBC-Treiber sein (z.B. forward only queries oder sonstwas) und hat nichts mit Qt zu tun.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

Husi
Beiträge: 6
Registriert: 29. Oktober 2018 19:07
Wohnort: Enger

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Husi » 10. November 2018 11:10

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?

Matti1104
Beiträge: 4
Registriert: 7. November 2018 16:01

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Matti1104 » 10. November 2018 12:02

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..

Husi
Beiträge: 6
Registriert: 29. Oktober 2018 19:07
Wohnort: Enger

Re: Datenbankausgabe über ein QTableView zeigt keine Werte an

Beitrag von Husi » 10. November 2018 12:11

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.

Antworten