Datenbank Sqlite



  • Hallo Zusammen
    Ich versuche eine Verbindung zu SQlite Datenbank zu erstellen. Leider bekomme ich ein paar Fehlermeldungen.

    Ohne #include <QtSql/QSQLiteDriver> ca. 49 Meldungen.
    Fehler:undefined reference to `_imp___ZN12QSqlDatabase17defaultConnectionE'
    usw.

    Jetzt nur noch 4 Meldungen
    Fehler:QtSql/private/qsqlcachedresult_p.h: No such file or directory
    Fehler:expected class-name before '{' token
    Fehler:'QSqlCachedResult' has not been declared
    Fehler:expected ',' or '...' before '&' token

    Was könnte das sein?
    Im "qsql_sqlite.h" habe ich ja nichts geändert. Dürfte doch keine Fehlermeldung auftreten.

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QMessageBox>
    #include <QtSql/QSQLiteDriver>
    #include <QtSql/QSqlDatabase>
    #include <QtSql/QSqlQuery>
    #include <QtSql/QSqlQueryModel>
    #include <QtSql/QSqlTableModel>
    #include <QDebug>
    
    #include <QtCore/QCoreApplication>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent), ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        QSqlDatabase db=QSqlDatabase::addDatabase("SQLITE");
    
        db.setDatabaseName("C:/Zeiterfassung/Zeiterfassung_2.sqlite");
        db.open();
            QSqlQuery query;
    
            if(db.isOpen()) //Wenn DB geöffnet wurde
            {
                if(query.exec(QString("SELECT * FROM user")))
                {
    //                if(query.next())//Auswählen
    //                {
    //                    //QDebug() << query.value(0).toString();
    //                    //QDebug() << query.value(1).toString();
    //                }
                    QSqlTableModel *Modul=new QSqlTableModel(this);
                    Modul->setTable("user");
                    Modul->select();
                    ui->tableView->setModel(Modul);
                }
            }
            else
            {
                    //Erster Start auf diesem computer --> Meldung
            }
            db.close();
    
        QSqlDatabase::removeDatabase("QSQLITE");
    
    }
    


  • Steht in deiner .pro auch QT += sql drinnen?
    Den include von QSQLiteDriver nimmst du wieder raus. Das ist ein Plugin und wird zur Laufzeit dynamisch geladen (ohne include, linken, o.Ä.)



  • Jetzt sind die Fehlermeldung weg aber die Daten werden noch nicht angezeigt.
    Ich vermute die Datenbank ist noch nicht geöffnet. Pfad zur Datei ist richtig.



  • Probiers mal mit "C:\\Zeiterfassung\\Zeiterfassung_2.sqlite" als Pfad.



  • arghonaut schrieb:

    Probiers mal mit "C:\\Zeiterfassung\\Zeiterfassung_2.sqlite" als Pfad.

    Habe ich auch schon probiert. Geht leider nicht.



  • Ich habe den Fehler gefunden.
    QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE"); //nicht SQLITE



  • addDatabase() will schon nen ordentlichen DriverName haben: "SQLITE" sollte "QSQLITE" heißen. Das ist der DriverName und nicht der ConnectionName (weshalb ein removeDatabase("QSQLITE") scheitern wird). An der Stelle aber zu versuchen, die Datenbankverbindung zu entfernen ist böse, da das QSqlTableModel die noch braucht. Lies dir auch die dicke Warnung zu QSqlDatabase::removeDatabase() durch.



  • Hallo

    Ich hab noch ein kleineres Problem und zwar geht es um den QSqlTableMode.
    Wenn ich die Daten Abrufe ist mein Zeitangabe noch nicht richtig Formatiert ( 2011-12-29 20:11:47 ).
    Gibts eine Möglichkeit das Format richtig einzustellen?
    Mit Sql könnte ich das Datum richtig abrufen nur habe ich keine Ahnung wie das mit dem QSqlTabelMode geht?

    Sql

    SELECT 
    strftime('%Y',StartZeit) as 'Datum', 
    strftime('%m',StartZeit) as 'Monat',
    strftime('%H:%M:%S',StartZeit) as 'Zeit',
    Stempelzeit.User_id as 'StempelNr'
    FROM Stempelzeit 
    where Datum='2011' and Monat= '10' and StempelNr=1
    
    all_model->setTable("Stempelzeit");
    
    all_model->setFilter("strftime('%Y-%m-%d',StartZeit) = '2011-12-29' and User_id='5'");
    
    all_model->select();
    
    ui->tableView->setModel(all_model);
    


  • Wie sieht den die "falsche" Formatierung bei dir gerade aus?



  • phcn.fraggle schrieb:

    Wie sieht den die "falsche" Formatierung bei dir gerade aus?

    Hallo

    Im Moment sieht's so aus:

    StartZeit
    2011-12-29 20:11:47

    Ziel sollte getrennt sein:

    Datum Monat Zeit
    29.12.2011 12 20:11:47



  • Hmm also die einfache Variante wäre natürlich wenn du dir direkt die Spalten in deiner Datenbanktabelle so anlegst, das wird dann auch automatisch in der View so abgebildet ( danach musst du dich nur noch um das Filtern der Einträge kümmern )

    Ich vermute mal du hast nur eine Spalte in deiner Tabelle in der du nur deine Zeitstempeldaten ablegst ( Deswegen bringt er dir auch nur diese eine Spalte )

    Du kannst aber auch mal folgendes ausprobieren:

    Da die QSqlTableModel Klasse von der QSqlQueryModel Klasse abgeleitet wird, kannst du ja mal versuchen deine komplette SQL-Query direkt als String über die Methode setQuery() abzuschicken. Ich meine das es so funktionieren müsste, die Spalten die dann durch die Aliasse entstehen sollten erkannt und abgebildet werden.


Anmelden zum Antworten