Seite 1 von 2

[gelöst] sqlite-Datenbank öffnen

Verfasst: 11. April 2012 23:40
von e.rohlfs
Erstmal ein kurzes Hallo. Ich bin neu im Forum und "nur" ein Hobby-Progger - gelesen hab ich schon viele Beiträge, weshalb ich große Hoffnung habe, dass mein Problem gelöst wird:
Ich habe ein Programm geschrieben, das eine sqlite-Datenbank für die Eingabedaten nutzt. Auf dem Rechner, auf dem ich programmiert habe (Windows 7, QT4.8), läuft alles nach Wunsch. Bei einem Test auf dem dem PC eines Bekannten (Win XP, kein QT) geht leider gar nichts. Gleich zu Beginn des Programms soll die DB-Verbindung geöffnet werden, was aber gleich verweigert wird. Nach der Lektüre einiger Threads hab ich versucht, die qtsqlite-DLL mitzugeben - ohne Erfolg. Ich weiß, die Infos sind ein wenig dünn, aber ich habe nicht so viele Gelegenheiten weitere Tests zu machen, um Ausgaben einzubauen o. ä., aber vielleicht hat ja jemand entsprechende Erfahrungen...
Gruß, Ernst

Was ich zu sagen vergessen habe: Es ist kein Absturz, sondern die MessageBox, die den fehlenden Zugriff abfängt, meldet "ordnungsgemäß", dass die DB nicht geöffnet werden kann.

Re: sqlite-Datenbank öffnen

Verfasst: 12. April 2012 09:27
von Christian81
Bitte erstmal ein wenig im Forum schauen - die Frage hatten wir erst vorgestern: http://qtforum.de/forum/viewtopic.php?f=3&t=14767

Re: sqlite-Datenbank öffnen

Verfasst: 12. April 2012 12:52
von e.rohlfs
Sehr wahrscheinlich bin ich es, der das nicht kapiert, aber ich habe die qsqlite4.dll ins Programmverzeichnis gelegt (wie laut "Deploying Plugins", wie ich es verstanden habe, auch möglich) und auch in ein Unterverzeichnis "sqldrivers" - leider ohne Erfolg. Gut möglich, dass ich es nicht kapiert habe, also einen deutlicheren Hinweis brauche. Um es zu verdeutlichen hier die Baumstruktur (Verzeichnisnamen hier groß geschrieben):

Code: Alles auswählen

HYDRO36  ---- SQLDRIVERS  ------ qsqlite4.dll
              hydro36.exe
              mingwm10.dll
              lib-gcc.....
              .
              .
              dbunit.sql

Das mit der Suche sagt sich auch so einfach: bei der Suche bekommt entweder man so viele Antworten, das es keinen Sinn macht weiter zu lesen oder man bekommt keine vernünftigen Antworten, weil man (ich) nicht die richtige Terminologie drauf habe. Da nimmt man auch das "Risiko" die anderen Nutzer des Forums zu nerven in Kauf - wofür ich mich für alle Zeiten entschuldige.
Gruß, Ernst

Re: sqlite-Datenbank öffnen

Verfasst: 12. April 2012 14:39
von Christian81
Das Unterverzeichnis ist schonmal richtig. Jetzt bitte prüfen was QSqlDatabase::drivers () zurückgibt.

Re: sqlite-Datenbank öffnen

Verfasst: 12. April 2012 17:16
von e.rohlfs
Ich habe da mal eine kleine Anwendung geschrieben, die die entsprechenden Abfragen macht und bekomme als Antwort, dass keine Treiber geladen sind und keine Verbindung hergestellt werden kann. :(
Die Anwendung besteht aus nur einem Hauptfenster mit einem Button und einem Textfeld darin, in die die Ausgaben geschrieben werden. Auf dem Win7-Rechner geht es , 3 Treiber werden mir angezeigt, Datenbank kann verbunden werden, auf meinem LINUX-Rechner, der genauso reagiert wie der XP-PC (WINE sei dank): keine Treiber, keine Verbindung.
Vielleicht hilft da der Code um so'nem DAU wie mir auf die Sprünge zu helfen.
mainwindow.cpp:

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QSqlDriver>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

static bool verbinden()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("dbunit.sqlite");
    if (!db.open()) {
        QString txt=db.lastError().text();
        QMessageBox::critical(0, "Datenbank-Fehler",  txt, QMessageBox::Cancel);
        QMessageBox::critical(0, qApp->tr("Kann Datenbank nicht öffnen"),
            qApp->tr("Es kann keine Verbindung zur Datenbank hergestellt werden.\n"
                     "Abbruch klicken um zu beenden."), QMessageBox::Cancel);
        return false;
    }
    return true;
}

void MainWindow::on_pushButton_clicked()
{
    QStringList liste= QSqlDatabase::drivers ();
    int ii=liste.count();
    int ix;
    QString txt;
    if (ii<1) {
        ui->textEdit->insertPlainText("keine Treiber geladen");
    } else
    for (ix=0;ix<ii;ix++) {
        txt=liste[ix]+"\n";
        ui->textEdit->insertPlainText(txt);
    }
    if (!verbinden()) {
        ui->textEdit->insertPlainText("\nkann Datenbankverbindung nicht öffnen");
    } else ui->textEdit->insertPlainText("Datenbankverbindung geöffnet");
}
und mainwindow.h:

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSql>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
Gruß, Ernst

Re: sqlite-Datenbank öffnen

Verfasst: 12. April 2012 17:33
von Christian81
Hast Du Qt unter Linux selbst kompiliert? Warum? Wurden dann auch die SQL-Plugins gebaut?

Re: sqlite-Datenbank öffnen

Verfasst: 12. April 2012 17:37
von e.rohlfs
Nein, ich habe unter Win7 den Creator benutzt und starte das Programm unter Linux-WINE als WIndows-Kompilat. Ich nehme den Lx-PC in diesem Fall nur zum Testen.

Re: sqlite-Datenbank öffnen

Verfasst: 13. April 2012 09:47
von RHBaum
Ne frage ist auch, wie das qt sqlite plugin gegen die sqlite linkt .... statisch oder dynamisch.
Falls dynamisch, dann brauchst noch ne sqlite3.dll (in deinem Prog verzeichniss oder nem system verzeichniss) oder sowas.

Das kriegst aber unter windows einfach selber raus:

DependencyWalker ... eh nen mega wichtiges tool unter windows zum proggen !
http://www.dependencywalker.com/

die dll damit oeffnen und schauen, ob deine abhaengigkeiten alle stimmen ... alle benoetigten dlls deinem prog zugaenglich sind ...

Bei mir bei der commerziellen version hab ich keine dynamische Abhaengigkeit ... keine ahnung wie es bei anderen ist.
aber so bekommst auch mit, welche anderen runtimes das teil verwendest .... nicht was inkompatibles zu gebaut hasst , bzw unter wine noch andere abhaengigkeiten fehlen ...

Ciao ....

Re: sqlite-Datenbank öffnen

Verfasst: 13. April 2012 10:52
von Christian81
Normalerweise wird unter Windows statisch gegen sqlite gelinkt, aber gute Idee.

Re: sqlite-Datenbank öffnen

Verfasst: 13. April 2012 14:11
von e.rohlfs
also, wenn ich das richtig sehe, ist das dynamisch gelinkt - ist halt Standard, sonst müsst ich etwas umstellen. Eine sqlite3.dll habe ich nicht auf meinem Win7-PC, findet sich nicht in QtSDK und Unterverzeichnissen.
Was ich habe ist die qsqlite4.dll, die ich ins das Unterverzeichnis sqldrivers im Programmverzeichnis kopiert habe. Natürlich habe ich auch schon mehr Versuche mit der Ablage von DLLs gemacht. Den Dependencywalker habe ich auch probiert, kann aber nicht ungewöhnliches entdecken. Unter WINE zeigt er mir beim Start einen Fehler an, er findet aber die QTSQL4.DLL und zeigt nur die Win-Bibliotheken mit roter Markierung an (KERNEL32.DLL und MSVCRT.DLL). Alles, was zu QT gehört und beiliegt (MINGWM10.DLL, QTSQL4.DLL, QTCORE4.DLL, QTGUI4.DLL und LIBGCC_S_DW2-1.DLL) ist "grün".
Ich bin überzeugt, dass ich einen blöden Anfängerfehler eingebaut habe. Das Programm (s. Code oben) startet ja, verhält sich richtig, hat aber keine SQL-Treiber geladen. Muss ich diese vielleicht explizit einfügen?

Re: sqlite-Datenbank öffnen

Verfasst: 14. April 2012 21:16
von Christian81
Wenn die Plugins korrekt in den jeweiligen Unterverzeichnissen liegen dann werden sie auch geladen - da muss man nichts extra programmieren (würde ja dem Begriff 'Plugins' auch irgendwie nicht gerecht).
Vielleicht ist im Plugin Cache was falsches eingetragen: http://doc.trolltech.com/4.7/deployment ... ugin-cache
Wenn es möglich ist, packe bitte alle ausführbaren Dateien (exe, dlls, plugins) so wie Du denkst dass es korrekt ist und lade es irgendwo hoch damit wir es uns mal anschauen können.

Re: sqlite-Datenbank öffnen

Verfasst: 15. April 2012 21:57
von e.rohlfs
ja, gute Idee! Ich hoffe das funktioniert mit Google-Docs: https://docs.google.com/open?id=0B2inAK ... kJrVDZLTW8.
Zwischendurch habe ich mir auch sqlite3.dll "besorgt" (erfolglos getestet) und noch eine andere Idee gehabt: Bei mir war sqlite3 im Verzeichnis von Python zu finden und da dachte ich: Python installiert u. U. die nötigen Treiber - gesagt, getan auf einer VM-Windows-Installation: leider auch wieder daneben gegriffen.
Also das Spiel geht weiter...

Re: sqlite-Datenbank öffnen

Verfasst: 16. April 2012 17:47
von Christian81
Du hast demnach nicht in der Registry geschaut wie ich gesagt habe - wie man dort sieht ist das qsqlite4.dll - Plugin von Qt 4.7 mit Visual Studio kompiliert, die Qt-Dlls aber von Qt4.8 mit gcc - das kann nicht gehen!

Re: sqlite-Datenbank öffnen

Verfasst: 16. April 2012 23:48
von e.rohlfs
Hallo Christian,
die qsqlite.dll ist aus dem qtcreator-Paket und nicht von mir kompiliert oder bearbeitet - habe auch die Sources nicht, fühle mich auch überfordert, wenn ich das selbst kompilieren sollte - und ist auch die Version, die funktioniert.
Dass Du mir gesagt haben solltest in die Registry zu schauen, habe ich wohl nicht richtig verstanden - meinst Du damit die Untersuchung mit dem DepWalker?
Wenn ich die Meldungen der kleinen Anwendung SQLITE, die ich online gestellt habe, mal interpretiere:
Der PC mit dem ich entwickle und auf dem es auch läuft (mit der o. g. qsqlite), meldet mir 3 Treiber (QSQLITE, QODBC3, QODBC) und "Datenbankverbindung geöffnet",
wobei auf dem anderen Rechner gemeldet wird:
"kein Treiber geladen" und entsprechende Fehler in MsgBoxen.
Für mich sieht das eher nach einem Problem mit dem System aus. Hat QT da vielleicht einen Dienst installiert, der die Datenbanktreiber anbietet? Allerdings finde ich nichts "verdächtiges" in den Diensten und auch nicht in der Windows-Registry, wo nur unter Einträgen von Programmen, die mit QT kompiliert wurden (z. B. digikam), Einträge mit dem DB-Treiber für SQLITE zu finden sind. Für mich auch hier ein Buch mit sieben Siegeln.
Gruß, E. Rohlfs

Re: sqlite-Datenbank öffnen

Verfasst: 17. April 2012 07:10
von Christian81
Was ist an "Die Qt-Dlls wurde mit MinGW, das sqlite-Plugin aber mit MSVC kompiliert - das kann nicht gehen" so schwer zu verstehen? Man kann keine MSVC und MinGW - C++-Dlls mischen - das machst du nämlich. Wo auch immer Du das sqlite-Plugin von MSVC her hast.
Und Registry schauen - ich habe extra einen Link gepostet wo genau das beschrieben ist!