Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Richtiger Umgang mit QSqlDatabase
Forum Updated to NodeBB v4.3 + New Features

Richtiger Umgang mit QSqlDatabase

Scheduled Pinned Locked Moved Unsolved German
32 Posts 2 Posters 14.1k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    knasan
    wrote on last edited by
    #7

    Da ich jetzt nicht wusste ob diese Informationen genügen, habe ich eine Example geschrieben wie ich es in meinem Original Code gemacht habe. Evtl. kann mir jemand sagen was ich falsch mache.

    main.cpp

    #include "forum.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Forum w;
        w.show();
    
        return a.exec();
    }
    
    

    forum.cpp

    #include "forum.h"
    #include "ui_forum.h"
    
    #include "mysqlconnect.h"
    #include <QDebug>
    #include <QStringList>
    #include <QPlainTextEdit>
    
    Forum::Forum(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Forum)
    {
        ui->setupUi(this);
    
        connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(GetUserInfo()));
    }
    
    Forum::~Forum()
    {
        delete ui;
    }
    
    void Forum::GetUserInfo()
    {
        // User Information setzen
        MySqlConnect sqlc;
        QStringList list = sqlc.GetUserInfo("SELECT * FROM person WHERE name = 'exampleuser'");
        qDebug() << list.toVector();
        QString PlainText;
        foreach(const QString &str, list)
        {
            qDebug() << str;
            PlainText += " " + str;
    
        }
        ui->plainTextEdit->insertPlainText(PlainText);
    }
    
    

    mysqlconnect.cpp

    #include "mysqlconnect.h"
    
    #include <QSqlDatabase>
    #include <QDebug>
    #include <QSqlQuery>
    #include <QStringList>
    #include <QSqlError>
    
    MySqlConnect::MySqlConnect(QObject *parent) : QObject(parent)
    {
        sqldb.setHostName("localhost");
        sqldb.setPassword("1b7cq");
        sqldb.setUserName("forum");
        sqldb.setDatabaseName("forumsqldatabase");
    }
    
    QStringList MySqlConnect::GetUserInfo(const QString &mysqlStr)
    {
        qDebug() << "GetUserInfo: " << mysqlStr;
    
        if(!sqldb.isOpen())
        {
            sqldb.open();
        }
    
        QStringList resultList;
        QSqlQuery query = MyQuery(mysqlStr);
        qDebug() << query.value(0);
        while(query.next())
        {
            resultList.append(query.value(0).toString());
            resultList.append(query.value(1).toString());
            resultList.append(query.value(2).toString());
        }
        qDebug() << "resultList: " << resultList.toVector();
        return resultList;
    }
    
    QSqlQuery MySqlConnect::MyQuery(const QString &myQuery)
    {
        qDebug() << "MyQuery: " << myQuery;
        QSqlQuery query(myQuery);
        qDebug() << query.lastError();
        return query;
    }
    
    

    forum.h

    #ifndef FORUM_H
    #define FORUM_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class Forum;
    }
    
    class Forum : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit Forum(QWidget *parent = 0);
        ~Forum();
    
    private:
        Ui::Forum *ui;
    
    private slots:
        void GetUserInfo();
    };
    
    #endif // FORUM_H
    
    

    mysqlconnect.h

    #ifndef MYSQLCONNECT_H
    #define MYSQLCONNECT_H
    
    #include <QObject>
    #include <QSqlDatabase>
    #include <QStringList>
    
    class MySqlConnect : public QObject
    {
        Q_OBJECT
    public:
        explicit MySqlConnect(QObject *parent = 0);
        QSqlQuery MyQuery(const QString &myQuery);
        QStringList GetUserInfo(const QString &mysqlStr);
    
    private:
        QSqlDatabase sqldb = QSqlDatabase::addDatabase("QMYSQL");
    };
    
    #endif // MYSQLCONNECT_H
    
    

    in der UI habe ich lediglich einen Button und ein PlainText hinzugefügt.
    Beim drücken des Buttons wird der Result in den PlainTextEdit eingefügt.

    Auch hier bekomme ich wieder die Fehlermeldung (beim zweiten drücken des Buttons)

    QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
    

    Wo müsste man jetzt ein removeDatabase einfügen ohne die Verbindung zur Datenbank beendet wird. Oder Vewende ich QSQLDatabase falsch?

    Ich danke euch schon mal im Vorraus für eure hilfe.

    Gruß Knasan

    jsulmJ 1 Reply Last reply
    0
    • K knasan

      Da ich jetzt nicht wusste ob diese Informationen genügen, habe ich eine Example geschrieben wie ich es in meinem Original Code gemacht habe. Evtl. kann mir jemand sagen was ich falsch mache.

      main.cpp

      #include "forum.h"
      #include <QApplication>
      
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
          Forum w;
          w.show();
      
          return a.exec();
      }
      
      

      forum.cpp

      #include "forum.h"
      #include "ui_forum.h"
      
      #include "mysqlconnect.h"
      #include <QDebug>
      #include <QStringList>
      #include <QPlainTextEdit>
      
      Forum::Forum(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::Forum)
      {
          ui->setupUi(this);
      
          connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(GetUserInfo()));
      }
      
      Forum::~Forum()
      {
          delete ui;
      }
      
      void Forum::GetUserInfo()
      {
          // User Information setzen
          MySqlConnect sqlc;
          QStringList list = sqlc.GetUserInfo("SELECT * FROM person WHERE name = 'exampleuser'");
          qDebug() << list.toVector();
          QString PlainText;
          foreach(const QString &str, list)
          {
              qDebug() << str;
              PlainText += " " + str;
      
          }
          ui->plainTextEdit->insertPlainText(PlainText);
      }
      
      

      mysqlconnect.cpp

      #include "mysqlconnect.h"
      
      #include <QSqlDatabase>
      #include <QDebug>
      #include <QSqlQuery>
      #include <QStringList>
      #include <QSqlError>
      
      MySqlConnect::MySqlConnect(QObject *parent) : QObject(parent)
      {
          sqldb.setHostName("localhost");
          sqldb.setPassword("1b7cq");
          sqldb.setUserName("forum");
          sqldb.setDatabaseName("forumsqldatabase");
      }
      
      QStringList MySqlConnect::GetUserInfo(const QString &mysqlStr)
      {
          qDebug() << "GetUserInfo: " << mysqlStr;
      
          if(!sqldb.isOpen())
          {
              sqldb.open();
          }
      
          QStringList resultList;
          QSqlQuery query = MyQuery(mysqlStr);
          qDebug() << query.value(0);
          while(query.next())
          {
              resultList.append(query.value(0).toString());
              resultList.append(query.value(1).toString());
              resultList.append(query.value(2).toString());
          }
          qDebug() << "resultList: " << resultList.toVector();
          return resultList;
      }
      
      QSqlQuery MySqlConnect::MyQuery(const QString &myQuery)
      {
          qDebug() << "MyQuery: " << myQuery;
          QSqlQuery query(myQuery);
          qDebug() << query.lastError();
          return query;
      }
      
      

      forum.h

      #ifndef FORUM_H
      #define FORUM_H
      
      #include <QMainWindow>
      
      namespace Ui {
      class Forum;
      }
      
      class Forum : public QMainWindow
      {
          Q_OBJECT
      
      public:
          explicit Forum(QWidget *parent = 0);
          ~Forum();
      
      private:
          Ui::Forum *ui;
      
      private slots:
          void GetUserInfo();
      };
      
      #endif // FORUM_H
      
      

      mysqlconnect.h

      #ifndef MYSQLCONNECT_H
      #define MYSQLCONNECT_H
      
      #include <QObject>
      #include <QSqlDatabase>
      #include <QStringList>
      
      class MySqlConnect : public QObject
      {
          Q_OBJECT
      public:
          explicit MySqlConnect(QObject *parent = 0);
          QSqlQuery MyQuery(const QString &myQuery);
          QStringList GetUserInfo(const QString &mysqlStr);
      
      private:
          QSqlDatabase sqldb = QSqlDatabase::addDatabase("QMYSQL");
      };
      
      #endif // MYSQLCONNECT_H
      
      

      in der UI habe ich lediglich einen Button und ein PlainText hinzugefügt.
      Beim drücken des Buttons wird der Result in den PlainTextEdit eingefügt.

      Auch hier bekomme ich wieder die Fehlermeldung (beim zweiten drücken des Buttons)

      QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
      

      Wo müsste man jetzt ein removeDatabase einfügen ohne die Verbindung zur Datenbank beendet wird. Oder Vewende ich QSQLDatabase falsch?

      Ich danke euch schon mal im Vorraus für eure hilfe.

      Gruß Knasan

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by jsulm
      #8

      @knasan said in Richtiger Umgang mit QSqlDatabase:

      Wo müsste man jetzt ein removeDatabase einfügen

      Nirgendwo. Man muss dafür sorgen, Dass die Datenbank nur einmal benutzt wird.
      Das Problem ist hier:

      oid Forum::GetUserInfo()
      {
          // User Information setzen
          MySqlConnect sqlc;
      ...
      

      Bei jedem Aufruf von Forum::GetUserInfo() wird eine Instanz von MySqlConnect erzeugt, die wiederum die DB-Verbindung aufbaut was zu dieser Warnung führt:

      QSqlDatabase sqldb = QSqlDatabase::addDatabase("QMYSQL");
      

      Solche Classen werden üblicherweise als Singleton benutzt um zu verhindern, dass mehr als eine Instanz erzeugt wird. Allerdings sind Singletons problematisch. Es ist besser innerhalb von MySqlConnect sicher zu stellen, dass die Verbindung nur einmal aufgebaut wird. Dafür kann man zuerst http://doc.qt.io/qt-5/qsqldatabase.html#database mit dem DB-Namen aufrufen. Falls QSqlDatabase, welches zurück gegeben wird, invalid ist (http://doc.qt.io/qt-5/qsqldatabase.html#isValid) wurde die Verbindung noch nicht aufgebaut, sonst existiert diese schon. Alternativ deklariert man die sqldb Variable als static, dann wird diese nur einmal initialisiert.
      Eigentlich is die sqlc Variable in MySqlConnect nicht notwendig, da ja QSqlDatabase diese ja schon vorhält.

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      1
      • K Offline
        K Offline
        knasan
        wrote on last edited by knasan
        #9

        Morgen, Danke @jsulm für die Ausführliche Erklärung. Ich werde es mir heute Abend nach der Arbeit nochmal genauer ansehen. Was ich noch nicht ganz verstanden habe ist.

        Alternativ deklariert man die sqldb Variable als static, dann wird diese nur einmal initialisiert.

        Auf die schnelle wollte ich einfach mal Testen,

        static QSqlDatabase sqldb = QSqlDatabase::addDatabase("QMYSQL"); 
        

        Das nahm mein Kompiler aber erst gar nicht an.

        Eigentlich is die sqlc Variable in MySqlConnect nicht notwendig, da ja QSqlDatabase diese ja schon vorhält.

        Im Beispiel habe ich in MySqlConnect die Variable sqlc gar nicht verwendet, nur im Forum. Und dort Initialisiere ich sozusagen die Klasse damit ich auf deren Funktionen zugreifen kann. Ist das falsch?

        Wenn ja, kann mir jemand ein Beispiel geben wie das richtig eingesetzt wird.

        Danke!

        Gruß knasan

        jsulmJ 1 Reply Last reply
        0
        • K knasan

          Morgen, Danke @jsulm für die Ausführliche Erklärung. Ich werde es mir heute Abend nach der Arbeit nochmal genauer ansehen. Was ich noch nicht ganz verstanden habe ist.

          Alternativ deklariert man die sqldb Variable als static, dann wird diese nur einmal initialisiert.

          Auf die schnelle wollte ich einfach mal Testen,

          static QSqlDatabase sqldb = QSqlDatabase::addDatabase("QMYSQL"); 
          

          Das nahm mein Kompiler aber erst gar nicht an.

          Eigentlich is die sqlc Variable in MySqlConnect nicht notwendig, da ja QSqlDatabase diese ja schon vorhält.

          Im Beispiel habe ich in MySqlConnect die Variable sqlc gar nicht verwendet, nur im Forum. Und dort Initialisiere ich sozusagen die Klasse damit ich auf deren Funktionen zugreifen kann. Ist das falsch?

          Wenn ja, kann mir jemand ein Beispiel geben wie das richtig eingesetzt wird.

          Danke!

          Gruß knasan

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #10

          @knasan

          // Im header
          static QSqlDatabase sqldb;
          
          //in cpp
          QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL"); 
          

          "Im Beispiel habe ich in MySqlConnect die Variable sqlc gar nicht verwendet" - spielt ja keine Rolle, da sqldb immer initialisiert wird unabhängig davon ob es benutzt wird oder nicht.

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0
          • K Offline
            K Offline
            knasan
            wrote on last edited by
            #11

            Also, so wirklich will das bei mir noch nicht.
            Im Header habe ich QSqlDatabase als static deklariert.

            mysqlconnect.h

            private:
                static QSqlDatabase sqldb;
            

            In mysqlconnect.cpp

            Habe ich ein addDatabase versucht.

            QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
            

            Dann bekommich ich die Fehlermeldung:
            qualified-id declaration before = token.

            und wenn einfach nur

            QSqlDatabase sqldb = QSqlDatabase::addDatabase("QMYSQL");
            

            Mache, was für mich auf den ersten Blick auch logisch erscheint, da ich ja die Variable sqldb deklariert habe, bekomme ich in jeder Funktion innerhalb von MySQLConnect die Fehlermeldung:

            undefinied reference to MySqlConnect::sqldb

            oder muss ich die Datenbank nicht in mysqlconnect.cpp machen sondern, wie in diesem Beispiel in Forum.cpp ?

            Das verstehe ich noch nicht so ganz.

            jsulmJ 1 Reply Last reply
            0
            • K knasan

              Also, so wirklich will das bei mir noch nicht.
              Im Header habe ich QSqlDatabase als static deklariert.

              mysqlconnect.h

              private:
                  static QSqlDatabase sqldb;
              

              In mysqlconnect.cpp

              Habe ich ein addDatabase versucht.

              QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
              

              Dann bekommich ich die Fehlermeldung:
              qualified-id declaration before = token.

              und wenn einfach nur

              QSqlDatabase sqldb = QSqlDatabase::addDatabase("QMYSQL");
              

              Mache, was für mich auf den ersten Blick auch logisch erscheint, da ich ja die Variable sqldb deklariert habe, bekomme ich in jeder Funktion innerhalb von MySQLConnect die Fehlermeldung:

              undefinied reference to MySqlConnect::sqldb

              oder muss ich die Datenbank nicht in mysqlconnect.cpp machen sondern, wie in diesem Beispiel in Forum.cpp ?

              Das verstehe ich noch nicht so ganz.

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #12

              @knasan said in Richtiger Umgang mit QSqlDatabase:

              Habe ich ein addDatabase versucht.
              QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");

              Wo? Es muss in MySqlConnect.cpp passieren.

              QSqlDatabase sqldb = QSqlDatabase::addDatabase("QMYSQL");
              

              das definiert eine neue sqldb Variable die überhaupt nichts mit MySqlConnect zu tun hat.
              "was für mich auf den ersten Blick auch logisch erscheint, da ich ja die Variable sqldb deklariert habe" - deklariert wurde diese als Member-Variable in MySqlConnect, in der Zeile oben wird aber eine neue Variable mit dem gleichen namen definiert.

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • K Offline
                K Offline
                knasan
                wrote on last edited by knasan
                #13

                Ich habe es im constructor in mysqlconnect.cpp eingetragen und die oben genannten Fehlermeldung bekommen.

                mysqlconnect.h

                private:
                    static QSqlDatabase sqldb;
                
                

                mysqlconnect.cpp

                MySqlConnect::MySqlConnect(QObject *parent) : QObject(parent)
                {
                    QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
                
                    sqldb.setHostName("localhost");
                    sqldb.setPassword("1b7cq");
                    sqldb.setUserName("forum");
                    sqldb.setDatabaseName("forumsqldatabase");
                }
                

                Dann erhalte ich die Fehlermeldung:

                mysqlconnect.cpp:12: Fehler: qualified-id in declaration before ‘=’ token
                     QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
                                                      ^
                

                Gruß Knasan

                jsulmJ 1 Reply Last reply
                0
                • K knasan

                  Ich habe es im constructor in mysqlconnect.cpp eingetragen und die oben genannten Fehlermeldung bekommen.

                  mysqlconnect.h

                  private:
                      static QSqlDatabase sqldb;
                  
                  

                  mysqlconnect.cpp

                  MySqlConnect::MySqlConnect(QObject *parent) : QObject(parent)
                  {
                      QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
                  
                      sqldb.setHostName("localhost");
                      sqldb.setPassword("1b7cq");
                      sqldb.setUserName("forum");
                      sqldb.setDatabaseName("forumsqldatabase");
                  }
                  

                  Dann erhalte ich die Fehlermeldung:

                  mysqlconnect.cpp:12: Fehler: qualified-id in declaration before ‘=’ token
                       QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
                                                        ^
                  

                  Gruß Knasan

                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by
                  #14

                  @knasan Das gehört NICHT in den Konstruktor! Statische variablen werden in C++ nur einmal initialisiert.
                  Siehe: https://www.tutorialspoint.com/cplusplus/cpp_static_members.htm

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  0
                  • K Offline
                    K Offline
                    knasan
                    wrote on last edited by
                    #15

                    Hallo @jsulm, danke für diesen Hinweis. Hab noch viel zu Lernen ;-)

                    Ich muss mir das Beispiel vom Link mal durchspielen und damit etwas rumspielen um das ganze komplett zu verstehen.

                    Ich habe jetzt eine neu Funktion OpenDBSQL(); hinzugefügt als privat. Aber auch hier erhalte ich die gleiche Fehlermeldung:

                    mysqlconnect.cpp:15: Fehler: qualified-id in declaration before ‘=’ token
                         QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
                                                          ^
                    

                    Gruß Knasan

                    jsulmJ 1 Reply Last reply
                    0
                    • K knasan

                      Hallo @jsulm, danke für diesen Hinweis. Hab noch viel zu Lernen ;-)

                      Ich muss mir das Beispiel vom Link mal durchspielen und damit etwas rumspielen um das ganze komplett zu verstehen.

                      Ich habe jetzt eine neu Funktion OpenDBSQL(); hinzugefügt als privat. Aber auch hier erhalte ich die gleiche Fehlermeldung:

                      mysqlconnect.cpp:15: Fehler: qualified-id in declaration before ‘=’ token
                           QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
                                                            ^
                      

                      Gruß Knasan

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #16

                      @knasan Noch mal: wenn sqldb static ist dann gehört diese Zeile in KEINE Methode/Konstruktor, sondern einfach in eine cpp Datei:

                      QSqlDatabase MySqlConnect::sqldb = QSqlDatabase::addDatabase("QMYSQL");
                      
                      MySqlConnect::MySqlConnect(QObject *parent) : QObject(parent)
                      {
                          sqldb.setHostName("localhost");
                          sqldb.setPassword("1b7cq");
                          sqldb.setUserName("forum");
                          sqldb.setDatabaseName("forumsqldatabase");
                      }
                      

                      Das stellt sicher, dass statische Variablen nur ein Mal initialisiert werden. Das wird auch in dem Link von mir so gemacht.

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0
                      • K Offline
                        K Offline
                        knasan
                        wrote on last edited by
                        #17

                        Sorry wenn ich jetzt nochmal genauer Nachfrage. Meinst du, dies gehört nicht in mysqlconnect.cpp sondern in einer Datei die meine Klasse mysqlconnect verwendet? In meinem Beispiel also in forum.cpp?

                        Gruß knasan

                        jsulmJ 1 Reply Last reply
                        0
                        • K knasan

                          Sorry wenn ich jetzt nochmal genauer Nachfrage. Meinst du, dies gehört nicht in mysqlconnect.cpp sondern in einer Datei die meine Klasse mysqlconnect verwendet? In meinem Beispiel also in forum.cpp?

                          Gruß knasan

                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on last edited by
                          #18

                          @knasan Doch, es gehört in mysqlconnect.cpp (wobei man das auch irgendwo anders unterbringen kann wenn man will), aber nicht in eine Methode, sondern so wie ich es oben gezeigt habe.

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          0
                          • K Offline
                            K Offline
                            knasan
                            wrote on last edited by
                            #19

                            Achso, es muss außerhalb einer Funktion stehen. Sozusagen global deklariert werden aber in mysqlconnect.cpp und da das Schlüsselwort static verwendet wurde wird diese nur einmal initialisiert.

                            jsulmJ 1 Reply Last reply
                            0
                            • K knasan

                              Achso, es muss außerhalb einer Funktion stehen. Sozusagen global deklariert werden aber in mysqlconnect.cpp und da das Schlüsselwort static verwendet wurde wird diese nur einmal initialisiert.

                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #20

                              @knasan Genau

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              0
                              • K Offline
                                K Offline
                                knasan
                                wrote on last edited by
                                #21

                                @jsulm vielen lieben Dank für diese Erklärung. Hab viel Dazugelernt.

                                Ich habe es in mein Hauptprojekt getestet und Funktioniert auch soweit super.
                                Leider gibt es immer ein "aber" und so auch in meinem Fall.

                                In meinem Hauptprojekt verwende ich zwei Datenbanken, eine QMYSQL und eine QSQLITE.
                                Sobald ich die QSQLITE auch als Static deklariere, funktioniert der Zugriff auf MySQL gar nicht mehr - "Driver not loaded". Es spielt hierbei keine Rolle ob ich die Klasse überhaupt verwende oder nicht. SQLite Funktioniert weiterhin.

                                Ich wollte dieses Problem mit eigen definierte ConnectionName umgehen. Dann habe ich jedoch überhaupt gar keinen Zugriff auf die Datenbank mehr. (MySQL und SQLite)

                                QSqlDatabase MySqlConnect:sqldb = QSqlDatabase::addDatabase("QMYSQL","first");
                                

                                Verwende ich keine expliziten ConnectionName oder "qt_sql_default_connection", funktioniert der Zugriff

                                QSqlDatabase MySqlConnect:sqldb = QSqlDatabase::addDatabase("QMYSQL","qt_sql_default_connection");
                                

                                Gruß Knasan

                                jsulmJ 1 Reply Last reply
                                0
                                • K knasan

                                  @jsulm vielen lieben Dank für diese Erklärung. Hab viel Dazugelernt.

                                  Ich habe es in mein Hauptprojekt getestet und Funktioniert auch soweit super.
                                  Leider gibt es immer ein "aber" und so auch in meinem Fall.

                                  In meinem Hauptprojekt verwende ich zwei Datenbanken, eine QMYSQL und eine QSQLITE.
                                  Sobald ich die QSQLITE auch als Static deklariere, funktioniert der Zugriff auf MySQL gar nicht mehr - "Driver not loaded". Es spielt hierbei keine Rolle ob ich die Klasse überhaupt verwende oder nicht. SQLite Funktioniert weiterhin.

                                  Ich wollte dieses Problem mit eigen definierte ConnectionName umgehen. Dann habe ich jedoch überhaupt gar keinen Zugriff auf die Datenbank mehr. (MySQL und SQLite)

                                  QSqlDatabase MySqlConnect:sqldb = QSqlDatabase::addDatabase("QMYSQL","first");
                                  

                                  Verwende ich keine expliziten ConnectionName oder "qt_sql_default_connection", funktioniert der Zugriff

                                  QSqlDatabase MySqlConnect:sqldb = QSqlDatabase::addDatabase("QMYSQL","qt_sql_default_connection");
                                  

                                  Gruß Knasan

                                  jsulmJ Offline
                                  jsulmJ Offline
                                  jsulm
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #22

                                  @knasan said in Richtiger Umgang mit QSqlDatabase:

                                  Driver not loaded

                                  Das ist ein komplett anderes Problem. Sehr wahrscheinlich fehlt die MySQL Client Library.
                                  Siehe z.B. hier was zu tun ist: https://stackoverflow.com/questions/40130698/qt-5-7-mysql-driver-not-loaded

                                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  1 Reply Last reply
                                  0
                                  • K Offline
                                    K Offline
                                    knasan
                                    wrote on last edited by
                                    #23

                                    @jsulm said in Richtiger Umgang mit QSqlDatabase:

                                    Das ist ein komplett anderes Problem. Sehr wahrscheinlich fehlt die MySQL Client Library.
                                    Siehe z.B. hier was zu tun ist: https://stackoverflow.com/questions/40130698/qt-5-7-mysql-driver-not-loaded

                                    Die Verbindung geht ja, wenn ich nur QMYSQL Verwende. Nur Zusammen mit einer weiteren Datenbank QSQLITE klappt die Verbindung nicht mehr. Die Treiber für MySQL unter Linux und den Connector C++ für Windows habe ich auf meine Systeme drauf. Daran kann es also nicht liegen.

                                    jsulmJ 1 Reply Last reply
                                    0
                                    • K knasan

                                      @jsulm said in Richtiger Umgang mit QSqlDatabase:

                                      Das ist ein komplett anderes Problem. Sehr wahrscheinlich fehlt die MySQL Client Library.
                                      Siehe z.B. hier was zu tun ist: https://stackoverflow.com/questions/40130698/qt-5-7-mysql-driver-not-loaded

                                      Die Verbindung geht ja, wenn ich nur QMYSQL Verwende. Nur Zusammen mit einer weiteren Datenbank QSQLITE klappt die Verbindung nicht mehr. Die Treiber für MySQL unter Linux und den Connector C++ für Windows habe ich auf meine Systeme drauf. Daran kann es also nicht liegen.

                                      jsulmJ Offline
                                      jsulmJ Offline
                                      jsulm
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #24

                                      @knasan "Sobald ich die QSQLITE auch als Static deklariere" - als weiter statische Variable? So

                                      QSqlDatabase MySqlConnect:sqldb1 = QSqlDatabase::addDatabase("QMYSQL", "first");
                                      QSqlDatabase MySqlConnect:sqldb2 = QSqlDatabase::addDatabase("QSQLITE", "second");
                                      

                                      ?
                                      Man kann ja nicht die gleiche sqldb Variable für mehr als eine Verbindung zur gleichen Zeit benutzen.
                                      Ehrlich gesagt verstehe ich immer noch nicht varum diese Variable überhaupt benötigt wird? Man kann eine Verbindung jeder Zeit von QSqlDatabase über ihren Namen bekommen. Wozu also der ganze Aufwand?

                                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      K 1 Reply Last reply
                                      0
                                      • K Offline
                                        K Offline
                                        knasan
                                        wrote on last edited by
                                        #25

                                        @jsulm ja so ähnlich.
                                        Ich habe zwei Klassen eine für MySQL und eine für SQLite.
                                        In den Header habe ich beide Datenbanken als Private und Static deklariert.

                                        qcsql.h

                                        static QSqlDatabase dbMySQL;
                                        

                                        und im Code qcsql.cpp
                                        in keiner Funktion usw. also wieder global ein

                                        QSqlDatabase QCSql::dbMySQL = QSqlDatabase::addDatabase("QMYSQL");
                                        

                                        qcsqlite.h

                                        static QSqlDatabase dbSQLite;
                                        

                                        qcsqlite.cpp

                                        QSqlDatabase QcSQLite::dbSQLite = QSqlDatabase::addDatabase("QSQLITE");
                                        

                                        In mein Hauptcode greife ich über Klassen auf die jeweilige Funktionen zu.
                                        Als erstes wird auf die SQLite zugegriffen, dort erscheint keine Fehlermeldung.
                                        Wenn ich aber auf die MYSQL Funktionen zugreife, erhalte ich die Fehlermeldung "driver not loaded".
                                        Diese Meldung kommt aber unabhängig ob ich auf die SQLite zugegriffen habe oder nicht, sobald SQLITE als static deklariert wurde, geht der Zugriff einfach auf MySQL nicht mehr.

                                        Wenn ich SQLITE nicht als static deklariere sondern den Treiber in den Header Initializiere, klappt der Zugriff auf der MySQL, allerdings darf man dann voher nicht SQLITE benutzt haben. Sobald ich SQLITE verwende geht der Zugriff auf der MySQL nicht mehr mit der Fehlermeldung "driver not loaded".

                                        Im Hauptprogramm cpp
                                        In einer Funktion ....

                                        QcSQLite qcsqlite;
                                        QStringList lastConnectInfoList = qcsqlite.GetLastConnectionsServer(); // Zugriff auf SQLite
                                        

                                        In einer anderen Funktion Zugriff auf MySQL

                                        QCSql qcsql;
                                        QSqlQuery query(qcsql.mysqlquery(myquery));
                                        

                                        Wobei die SQLite beim ersten Aufruf automatisch aufgerufen wird und die der MySQL nur nach bedarf.

                                        jsulmJ 1 Reply Last reply
                                        0
                                        • K knasan

                                          @jsulm ja so ähnlich.
                                          Ich habe zwei Klassen eine für MySQL und eine für SQLite.
                                          In den Header habe ich beide Datenbanken als Private und Static deklariert.

                                          qcsql.h

                                          static QSqlDatabase dbMySQL;
                                          

                                          und im Code qcsql.cpp
                                          in keiner Funktion usw. also wieder global ein

                                          QSqlDatabase QCSql::dbMySQL = QSqlDatabase::addDatabase("QMYSQL");
                                          

                                          qcsqlite.h

                                          static QSqlDatabase dbSQLite;
                                          

                                          qcsqlite.cpp

                                          QSqlDatabase QcSQLite::dbSQLite = QSqlDatabase::addDatabase("QSQLITE");
                                          

                                          In mein Hauptcode greife ich über Klassen auf die jeweilige Funktionen zu.
                                          Als erstes wird auf die SQLite zugegriffen, dort erscheint keine Fehlermeldung.
                                          Wenn ich aber auf die MYSQL Funktionen zugreife, erhalte ich die Fehlermeldung "driver not loaded".
                                          Diese Meldung kommt aber unabhängig ob ich auf die SQLite zugegriffen habe oder nicht, sobald SQLITE als static deklariert wurde, geht der Zugriff einfach auf MySQL nicht mehr.

                                          Wenn ich SQLITE nicht als static deklariere sondern den Treiber in den Header Initializiere, klappt der Zugriff auf der MySQL, allerdings darf man dann voher nicht SQLITE benutzt haben. Sobald ich SQLITE verwende geht der Zugriff auf der MySQL nicht mehr mit der Fehlermeldung "driver not loaded".

                                          Im Hauptprogramm cpp
                                          In einer Funktion ....

                                          QcSQLite qcsqlite;
                                          QStringList lastConnectInfoList = qcsqlite.GetLastConnectionsServer(); // Zugriff auf SQLite
                                          

                                          In einer anderen Funktion Zugriff auf MySQL

                                          QCSql qcsql;
                                          QSqlQuery query(qcsql.mysqlquery(myquery));
                                          

                                          Wobei die SQLite beim ersten Aufruf automatisch aufgerufen wird und die der MySQL nur nach bedarf.

                                          jsulmJ Offline
                                          jsulmJ Offline
                                          jsulm
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #26

                                          @knasan said in Richtiger Umgang mit QSqlDatabase:

                                          QSqlDatabase::addDatabase("QSQLITE")

                                          Ich würde beiden Datenbanken einen eindeutigen Namen geben, sonst überschreibt der zweite Aufruf von addDatabase() die Default-Verbindung.

                                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved