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
QtWS25 Last Chance

Richtiger Umgang mit QSqlDatabase

Scheduled Pinned Locked Moved Unsolved German
32 Posts 2 Posters 13.7k 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
    #1

    Hallo Forum,

    ich Frage mich wie man mit QSqlDatabase richtig umgeht, denn ein ständiges öffnen und Schließen der Datenbank verursacht natürlich auch gleichzeitig viel Traffic und benötig unnötig Rechenzeit usw. Deswegen ist es doch normal Sinnvoll die Datenbank immer offen zu halten wenn man so wie so immer darauf zugreifen möchte solange die Application läuft, oder sehe ich das Falsch?

    Außerdem, ist meine art wie ich es Programmiert habe vermutlich total falsch, weil extrem Fehleranfällig.

    Mein Vorgehen bisher.
    Eine Klasse QCSql
    Dort wurde die Datenbank als Privat erstellt und ein paar Slots und Funktionen Deklariert.
    in der cpp habe ich dann die Datenbank geöffnet und bevor ich die Funktionen und Slots bediene.
    Im Destruktor habe ich dann die Datenbank wieder geschlossen und den Treiber (sag ich mal so) entfernt.

    QSqlDatabase::removeDatabase(connectionName);
    

    Da ich auch einen Query zurück gebe, was nur ein zwei mal im Code benötig wurde, scheint immer wieder mal die Datenbank nicht richtig geschlossen zu werden. Beispiel

    Mein Hauptprogramm

    QCSql qcsql;
    qcsql.insert("INSERT INTO ....);
    QSqlQuery q = qcsql.getquery("SELECT user FROM usertbl");
    

    ......
    Laut Debuger war ich noch nicht im Destruktor von QCSql und daher ist die Verbindung noch offen.
    Erst nachdem die Funktion fertig ist, geht dieser im Destruktor, aber dennoch ist der ConnectionName noch vorhanden und rufe ich erneut QCSql auf bekomme ich die Warnung "Still in use", oder "duplicate DatabaseName".

    Daher dachte ich, es würde doch Sinn machen die Datenbank erst nicht zu schließen.

    Ich verwende neben eine MySQL auch eine SQLite Datenbank, füge ich diese auch noch hinzu weiß QT nicht mehr welchen Treiber er verwenden soll, wenn der alte noch vorhanden war.

    Deswegen Interessiert mich wie man richtig damit umgeht.

    Kann mir jemand dabei helfen?

    Vielen Dank.

    jsulmJ 1 Reply Last reply
    0
    • K knasan

      Hallo Forum,

      ich Frage mich wie man mit QSqlDatabase richtig umgeht, denn ein ständiges öffnen und Schließen der Datenbank verursacht natürlich auch gleichzeitig viel Traffic und benötig unnötig Rechenzeit usw. Deswegen ist es doch normal Sinnvoll die Datenbank immer offen zu halten wenn man so wie so immer darauf zugreifen möchte solange die Application läuft, oder sehe ich das Falsch?

      Außerdem, ist meine art wie ich es Programmiert habe vermutlich total falsch, weil extrem Fehleranfällig.

      Mein Vorgehen bisher.
      Eine Klasse QCSql
      Dort wurde die Datenbank als Privat erstellt und ein paar Slots und Funktionen Deklariert.
      in der cpp habe ich dann die Datenbank geöffnet und bevor ich die Funktionen und Slots bediene.
      Im Destruktor habe ich dann die Datenbank wieder geschlossen und den Treiber (sag ich mal so) entfernt.

      QSqlDatabase::removeDatabase(connectionName);
      

      Da ich auch einen Query zurück gebe, was nur ein zwei mal im Code benötig wurde, scheint immer wieder mal die Datenbank nicht richtig geschlossen zu werden. Beispiel

      Mein Hauptprogramm

      QCSql qcsql;
      qcsql.insert("INSERT INTO ....);
      QSqlQuery q = qcsql.getquery("SELECT user FROM usertbl");
      

      ......
      Laut Debuger war ich noch nicht im Destruktor von QCSql und daher ist die Verbindung noch offen.
      Erst nachdem die Funktion fertig ist, geht dieser im Destruktor, aber dennoch ist der ConnectionName noch vorhanden und rufe ich erneut QCSql auf bekomme ich die Warnung "Still in use", oder "duplicate DatabaseName".

      Daher dachte ich, es würde doch Sinn machen die Datenbank erst nicht zu schließen.

      Ich verwende neben eine MySQL auch eine SQLite Datenbank, füge ich diese auch noch hinzu weiß QT nicht mehr welchen Treiber er verwenden soll, wenn der alte noch vorhanden war.

      Deswegen Interessiert mich wie man richtig damit umgeht.

      Kann mir jemand dabei helfen?

      Vielen Dank.

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

      @knasan Vielleich verstehe ich etwas falsch, aber es gibt keinen Grund die Datenbank ständig zu öffnen und zu schliessen. Man macht es einmal und benutzt die Verbindung. Es ist beschrieben in der Doku: http://doc.qt.io/qt-5/qsqldatabase.html

      // Verbindung aufbauen
      QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
      db.setHostName("acidalia");
      db.setDatabaseName("customdb");
      db.setUserName("mojito");
      db.setPassword("J0a1m8");
      bool ok = db.open();
      
      // Die Standardverbindung, man kann auch eine bestimmte Verbindung über deren Namen bekommen
      QSqlDatabase db = QSqlDatabase::database();
      

      "Deswegen ist es doch normal Sinnvoll die Datenbank immer offen zu halten" - das macht QSqlDatabase doch schon?

      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
        #3

        Danke @jsulm
        aus dieser Dokumentation habe ich auch wie ich die Verbindung herstelle.
        Mein Problem ist jetzt, wie ich damit richtig umgehe.
        Ich bin C++ Anfänger und evtl. mach ich ja etwas falsch.

        1. Ich habe eine Klasse, diese macht die Verbindung auf, ich kann also im Destruktor die Verbindung offen halten.
          Wenn ich das so machen würde, dann hätte ich aber das Problem das jedes mal wenn ich auf die Klasse zugreifen möchte, das ich die Warnung bekomme, das es schon ein Name mit dieser Verbindung existiert. Gebe ich einen ConnectionName an bekomme ich sogar die Meldung das er den Treiber nicht laden konnte.
        QSqlDatabase::addDatabase("QMYSQL","meinConnectioName");
        
        1. Wenn ich jetzt noch eine SQLite Datenbank hinzufügen möchte, bekomme ich auch so eine Fehlermeldung bzw. Die SQLite habe ich auch in einer eigenen Klasse ausgelagert.

        2. So greife ich darauf zu.
          In meiner Klassendefinition (Header) erstelle ich jeweils als Private die Datenbank Connector

        In der Header von MySQL

        QSqlDatabase dbMySQL = QSqlDatabase::addDatabase("QMYSQL"); // qt_sql_default_connection
        

        In der Header von SQLite

        QSqlDatabase dbSQlite = QSqlDatabase::addDatabase("QSQLITE"); // qt_sql_default_connection
        

        Würde ich einen Connection Name angeben, kann der Treiber nicht geladen werden.

        Ich modifiziere mal mein Code so, das die Datenbank erst geschlossen wird, wenn das Programm beendet wird.
        Also im Destruktor von meiner Hauptprogramm.

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

          So, ich habe mein Code so umgeschrieben das die Verbindung erst mal gar nicht geschlossen wird.
          Auch wird erst mal keine Verbindung zur QSQLite hergestellt sondern nur zur QMYSQL.

          Im Code selbst kommt dann, wenn ich eine Funktion die die MySQL aufbaut die Warnmeldung

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

          Meine Header habe ich mit #ifndef und #ifdef deklariert, also diese wird nur einmal durchlaufen.
          Ich versteht noch nicht, wie diese Fehlermeldung zustande kommt.

          Kann es sein das man diese Fehlermeldung bekommt wenn man das Passwort, Datenbank usw. setzt. Darf diese Aktion auch nur einmal vorkommen? bzw. erst wieder wenn man die Datenbank geschlossen hat?
          Denn das wird bei mir jedes mal mit den Konstruktor gemacht ohne das ich Prüfe ob die Datenbank offen ist oder nicht.

          Gruß Knasan

          jsulmJ 1 Reply Last reply
          0
          • K knasan

            So, ich habe mein Code so umgeschrieben das die Verbindung erst mal gar nicht geschlossen wird.
            Auch wird erst mal keine Verbindung zur QSQLite hergestellt sondern nur zur QMYSQL.

            Im Code selbst kommt dann, wenn ich eine Funktion die die MySQL aufbaut die Warnmeldung

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

            Meine Header habe ich mit #ifndef und #ifdef deklariert, also diese wird nur einmal durchlaufen.
            Ich versteht noch nicht, wie diese Fehlermeldung zustande kommt.

            Kann es sein das man diese Fehlermeldung bekommt wenn man das Passwort, Datenbank usw. setzt. Darf diese Aktion auch nur einmal vorkommen? bzw. erst wieder wenn man die Datenbank geschlossen hat?
            Denn das wird bei mir jedes mal mit den Konstruktor gemacht ohne das ich Prüfe ob die Datenbank offen ist oder nicht.

            Gruß Knasan

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

            @knasan
            "duplicate connection name 'qt_sql_default_connection', old connection removed" - es wurde wohl schon eine default connection vorher aufgebaut. Wo weis ich nicht, da ich ja den Code nicht habe.

            "Im Code selbst kommt dann, wenn ich eine Funktion die die MySQL aufbaut die Warnmeldung" - wo wird diese aufgerufen?

            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
              #6

              Guten Morgen,

              in meiner Header

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

              in meiner CPP Klasse von meiner Datenbank im Kunstruktor

              QCSql::QCSql()
              {
                  qDebug() << "QCSql:QCSql()";
                  qDebug() << "QCSql::QCSql() - Connect to DB";
              
                  // Develop
                  dbCentassist.setUserName("user");
                  dbCentassist.setPassword("geheim");
              
                  if(isDevelop)
                  {
                      qDebug() << "QCSql::QCSql() - Develop";
                      dbCentassist.setHostName("hostname");
                      dbCentassist.setDatabaseName("Datenbank");
                  } else {
                      // WORK
                      qDebug() << "QCSql::QCSql() - Work";
                      dbCentassist.setHostName("hostname2"); 
                      dbCentassist.setDatabaseName("Datenbank");
                  }
              }
              

              In meiner Hauptklasse mache ich dann ein

              QCSql qcsql;
              QCsql.mysqlquery("INSERT INTO ....");
              

              Das mach ich halt in Slots und Funktionen in meiner Hauptklasse wo ich diese brauche.

              Gruß Knasan

              1 Reply Last reply
              0
              • 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

                                          • Login

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