QT TableView

Alles rund um die Programmierung mit Qt
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QSQLITE musst du per "setDatabaseName()" eine Datei geben, die die sqlite-Datenbank enthält.
Was hast du denn eigentlich für ne Datenbank am Start?
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ja sqlite hab ich jetzt genommen.
sehr schön die fehler sind weg. =)
Aber der table ist leer :(
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nvidia hat geschrieben:Aber der table ist leer :(
Enthält denn deine Datenbank schon Daten? Was weißt du bisher über Datenbanken und deren Verwendung?
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

Code: Alles auswählen

QSqlQuery query;
    query.prepare("INSERT INTO person (forename, surname) "
              "VALUES (:forename, :surname)");
    query.bindValue(":forename", "Bart");
    query.bindValue(":surname", "Simpson");
    query.exec();
Danach müsste sie ja was enthalten.
Naja die sind halt zum Daten lagern da.
Ach ich hab in meinem Buch den SQL Teil gefunden, den schau ich mir an.
Aber ich darf noch was fragen, wenn ich nicht weiter komm ok.
nvidia
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Bevor du irgend etwas in die DB abspeichern kannst, müssen die Tabellen existieren. Dazu das "CREATE TABLE" statement nachschlagen.
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

das ist komisch.
Im Buch steht folgendes

CREATE TABLE artist (
id INTEGER PRIMARY KEY,
name VARCHAR(40) NOT NULL,
country VARCHAR(40));
CREATE TABLE cd (
id INTEGER PRIMARY KEY,
title VARCHAR(40) NOT NULL,
artistid INTEGER NOT NULL,
year INTEGER NOT NULL,
FOREIGN KEY (artistid) REFERENCES artist);
CREATE TABLE track (
id INTEGER PRIMARY KEY,
title VARCHAR(40) NOT NULL,
duration INTEGER NOT NULL,
cdid INTEGER NOT NULL,
FOREIGN KEY (cdid) REFERENCES cd);

Aber nichts wie man das einfügt. Der unterringelt mir das schön rot.
ich glaub ich hab das falsche Buch besorgt.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nvidia hat geschrieben:Aber nichts wie man das einfügt. Der unterringelt mir das schön rot.
Das ist ein ganz normaler SQL-Query.

Code: Alles auswählen

QSqlQuery query ("CREATE TABLE <blabla usw.>");
query.exec();
sowas
Beiträge: 105
Registriert: 19. September 2006 16:02

QT TableView

Beitrag von sowas »

Hallo,
das Buch ist schon richtig, aber beim Beispiel geht es nicht um QT sondern
um sql, das ist eine eigene Sprache aus der Steinzeit der EDV, mit ihr kannst du aus Millionen von Datensätzen und Tausenden von Tabellen innerhalb von wenigen Sekunden Daten erhalten. Vorher müssen diese Tabellen angelegt und befüllt werden.
Im deinen Beispiel werden vier leere Tabellen mit einer der sql-Sprachen
angelegt. Hierfür brauchst du weitere Infos wie man sql arbeitet.
Ganz bekannt ist Mysql oder auch postgresql. Es gibt auch kommerzielle
Datenbanken für mehrere Tausend Euros.
bk
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

gibst dann schon eine weiterentwicklung von sql?
gibt es einen großen unterschied zwischen den datenbank? ist sqlite gut?

also mein Code sieht nun so aus:

Code: Alles auswählen

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("Hello");
    db.open();
    QSqlQuery query("CREATE TABLE person (forename char(20),surname char(20) ");
    query.prepare("INSERT INTO person (forename, surname) "
              "VALUES (:forename, :surname)");
    query.bindValue(":forename", "Bart");
    query.bindValue(":surname", "Simpson");
    query.exec();

Code: Alles auswählen

model->setQuery("SELECT firstname, surname FROM person");
sowas
Beiträge: 105
Registriert: 19. September 2006 16:02

QT TableView

Beitrag von sowas »

sqlite kenn ich nicht - aber ich vermute, dass man den Namen ..lite bewusst gewählt hat. Die meisten Infos gibt es über mysql, ich verwende postgresql.
mfg bk
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nvidia hat geschrieben:gibst dann schon eine weiterentwicklung von sql?
gibt es einen großen unterschied zwischen den datenbank? ist sqlite gut?
Es gibt große Unterschiede. Angefangen bei der Lizenz, gibt es verschiedene Erweiterungen, die bestimmte Sachen zusätzlich zum SQL anbieten.
sqlite ist recht minimal, das aber für die meisten Desktop-Programme zum Speichern reichen sollte. Speziell dadurch, dass es mit einem normalen File arbeitet, und keine laufenden Server samt DB-Benutzereinrichtung braucht.
Für ein Forum würde ich jetzt nicht unbedingt sqlite nehmen. Zum Testen, für die ersten Gehversuche mit Datenbanken und Queries usw. würde ich sqlite nehmen, da es die geringsten Einstiegshürden hat. Für später kannst du ja dann Testen, ob SQLITE noch reicht. Dank der Abstraktion in Qt ist das Umstellen ja recht wenig Aufwand.

Und in deinem letzten Code fehlt mir das "query.exec()", das dann auch tatsächlich die Tabellen anlegt!
Wenn die Tabellen schon existieren gibt das einen Fehler.
Du kannst das recht einfach machen, wenn du die CREATE TABLE-Anweisung erweiterst:

Code: Alles auswählen

CREATE TABLE IF NOT EXISTS
Sollte auch mit SQLite funktionieren.
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ich versteh grat nicht mehr was da fehlt
die Datenbank wird erstellt und geöffnet.
Der Table wird erstellt und zwei 2 Daten werden eingefügt.
Der Query wird ausgeführt.

Und mit model->setQuery("SELECT firstname FROM person");
werden die daten dem Model und dann dem TableView übergeben.
tableView->setModel(model);
Aber wieso ist er immer noch leer :(
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Nvidia hat geschrieben:Betrug xD
die brauchen so was nicht.
http://doc.trolltech.com/4.6/sql-cachedtable.html
du meinst also, dieses "createConnection()" steht da einfach nur so zum Spass....?
Und mit model->setQuery("SELECT firstname FROM person");
werden die daten dem Model und dann dem TableView übergeben.
tableView->setModel(model);
Aber wieso ist er immer noch leer Sad
was meint denn

Code: Alles auswählen

if (model.lastError().isValid())
     qDebug() << model.lastError();
(wie in der Doku zu setQuery() beschrieben)?

[EDIT]
Ach ja: "forename" != "firstname" ......
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

die connection hab ich.
das hab mit dem forename hab ich ausgebessert.
Ok ich krieg den Fehler es gibt keinen person table
hier nochmal der code:

Code: Alles auswählen

#ifndef SQL_H
#define SQL_H

#include <QSqlQuery>
#include <QSqlDatabase>

static void database()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("Hello");
    db.open();
    QSqlQuery query("CREATE TABLE person (firstname char(20),surname char(20)");
    query.prepare("INSERT INTO person (firstname, surname) "
              "VALUES (:firstname, :surname)");
    query.bindValue(":firstname", "Bart");
    query.bindValue(":surname", "Simpson");
    query.exec();
}
#endif // SQL_H

Code: Alles auswählen

#include <QApplication>
#include <QtGui>
#include "mainwindow.h"
#include "SQL.h"



int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    database();
    MainWindow Q;
    Q.resize(880,550);
    Q.show();
    return app.exec();
}

Code: Alles auswählen

model = new QSqlQueryModel(new_view);
    model->setHeaderData(0, Qt::Horizontal, tr("First name"));
    model->setQuery("SELECT firstname FROM person");
        qDebug() << model->lastError();
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Hab ich doch oben schon geschrieben, nochmal ausführlicher: Separates Query zum Erstellen der Tabelle, idealerweise mit "CREATE TABLE IF NOT EXISTS", dieses Query ausführen. Danach dein neues Query mit dem Insert.

// edit:
Hier einfach mal passender Code...

Code: Alles auswählen

static void database()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("Hello");
    db.open();

    QSqlQuery tableQuery("CREATE TABLE IF NOT EXISTS person (firstname char(20),surname char(20)");
    tableQuery.exec();

    QSqlQuery query;
    query.prepare("INSERT INTO person (firstname, surname) "
              "VALUES (:firstname, :surname)");
    query.bindValue(":firstname", "Bart");
    query.bindValue(":surname", "Simpson");
    query.exec();
} 
Wenn das mit dem IF NOT EXISTS nicht funktionieren sollte (hab es mit SQLite noch nicht verwendet) lass es weg. Dann solltest du aber prüfen, ob die Tabelle schon existiert.
Zuletzt geändert von franzf am 29. April 2010 18:08, insgesamt 1-mal geändert.
Antworten