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 13.9k 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
    #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
                      • K Offline
                        K Offline
                        knasan
                        wrote on last edited by
                        #27

                        @jsulm Du meinst

                        QSqlDatabase::addDatabase("QSQLITE","verbindungsname");
                        

                        ?

                        Dann bekomme ich keine Verbindung mehr hin.

                        1 Reply Last reply
                        0
                        • jsulmJ jsulm

                          @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?

                          K Offline
                          K Offline
                          knasan
                          wrote on last edited by
                          #28

                          @jsulm said in Richtiger Umgang mit QSqlDatabase:

                          Man kann eine Verbindung jeder Zeit von QSqlDatabase über ihren Namen bekommen. Wozu also der ganze Aufwand?

                          Das habe ich irgendwie übersehen sorry. Ich bin ein C++ Neuling und auch Qt ist für mich noch fremd. Deswegen weiß ich leider noch nicht was falsch und was richtig ist, deshalb hab ich mich an dieses Forum gewand damit ich es Lerne. (Eine C++ Schulung inkl. Qt ist in Planung)

                          Bitte entschuldige also wenn ich Dumme Fragen stelle.

                          Wie ist das gemeint, ich kann die Verbindung über den Namen bekommen? Über den ConnectionName?
                          Kannst du mir ein Link nennen oder ein kleines einfaches Example schreiben wo das ersichtlich ist was du meinst?

                          Gruß und Danke

                          jsulmJ 1 Reply Last reply
                          0
                          • K knasan

                            @jsulm said in Richtiger Umgang mit QSqlDatabase:

                            Man kann eine Verbindung jeder Zeit von QSqlDatabase über ihren Namen bekommen. Wozu also der ganze Aufwand?

                            Das habe ich irgendwie übersehen sorry. Ich bin ein C++ Neuling und auch Qt ist für mich noch fremd. Deswegen weiß ich leider noch nicht was falsch und was richtig ist, deshalb hab ich mich an dieses Forum gewand damit ich es Lerne. (Eine C++ Schulung inkl. Qt ist in Planung)

                            Bitte entschuldige also wenn ich Dumme Fragen stelle.

                            Wie ist das gemeint, ich kann die Verbindung über den Namen bekommen? Über den ConnectionName?
                            Kannst du mir ein Link nennen oder ein kleines einfaches Example schreiben wo das ersichtlich ist was du meinst?

                            Gruß und Danke

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

                            @knasan Es gibt keine dummen Fragen nur dumme Antworten :-)

                            // Datenbankverbindung einmalig initialisieren und ihr einen namen geben (hier "my_db")
                            QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", "my_db");
                            db.setHostName("acidalia");
                            db.setDatabaseName("customdb");
                            db.setUserName("mojito");
                            db.setPassword("J0a1m8");
                            bool ok = db.open();
                            
                            // Dann später überall dort wo die Verbindung benötigt wird:
                            QSqlDatabase db = QSqlDatabase::database("my_db");
                            

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

                              Okay, das habe ich gemeint.

                              Wenn ich bei mir ein Verbindungsname anlege, dann kommt die Verbindung gar nicht zustande.
                              Muss
                              db.setHostName("") usw auch global deklariert sein? Oder kann das in Konstruktor vorgenommen werden bzw. in einer Funktion?

                              Bei mir wäre das zum Beispiel im Konstruktor.

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

                                @jsulm said in Richtiger Umgang mit QSqlDatabase:

                                // Datenbankverbindung einmalig initialisieren und ihr einen namen geben (hier "my_db")
                                QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", "my_db");
                                db.setHostName("acidalia");
                                db.setDatabaseName("customdb");
                                db.setUserName("mojito");
                                db.setPassword("J0a1m8");
                                bool ok = db.open();

                                Ich wollte dies nachvollziehen, damit ich Lerne und Verstehe wie das mit den ConnectionName funktioniert.
                                Also initialisiere ich die DB Global am Anfang über MainWindow::MainWindow in ein neues Standard Project.

                                QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","first");
                                

                                In MainWindow:MainWindow wollte ich die Datenbank mit Port, Passwort und Username usw füllen.

                                QSqlDatabase db = QSqlDatabase::database("first");
                                    db.setUserName("root");
                                    db.setPassword("");
                                    db.setHostName("localhost");
                                    db.setDatabaseName("user");
                                    db.setPort(3306);
                                    bool ok = db.open();
                                    if(ok) {
                                        qDebug() << "Datenbank geöffnet";
                                    }
                                    qDebug() << db.lastError();
                                

                                Und jetzt kommt etwas, was ich noch nicht verstehe.

                                1. ist der Connectionname first, wie in diesem Beispiel sagt mir db.lastError() Unable to connect (Access denied for user)
                                2. ist der Connectionname aber qt_sql_default_connection, funktioniert alles wie gewünscht.
                                3. Egal ob Access denied kommt oder nicht ein db.open ist immer True? Ich hätte jetzt erwartet das ein db.open False ist, da ich ja auch ein Access denied bekomme.

                                Kann mir jemand diese drei dinge erklären warum das so ist?

                                Gruß Knasan

                                jsulmJ 1 Reply Last reply
                                0
                                • K knasan

                                  @jsulm said in Richtiger Umgang mit QSqlDatabase:

                                  // Datenbankverbindung einmalig initialisieren und ihr einen namen geben (hier "my_db")
                                  QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", "my_db");
                                  db.setHostName("acidalia");
                                  db.setDatabaseName("customdb");
                                  db.setUserName("mojito");
                                  db.setPassword("J0a1m8");
                                  bool ok = db.open();

                                  Ich wollte dies nachvollziehen, damit ich Lerne und Verstehe wie das mit den ConnectionName funktioniert.
                                  Also initialisiere ich die DB Global am Anfang über MainWindow::MainWindow in ein neues Standard Project.

                                  QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","first");
                                  

                                  In MainWindow:MainWindow wollte ich die Datenbank mit Port, Passwort und Username usw füllen.

                                  QSqlDatabase db = QSqlDatabase::database("first");
                                      db.setUserName("root");
                                      db.setPassword("");
                                      db.setHostName("localhost");
                                      db.setDatabaseName("user");
                                      db.setPort(3306);
                                      bool ok = db.open();
                                      if(ok) {
                                          qDebug() << "Datenbank geöffnet";
                                      }
                                      qDebug() << db.lastError();
                                  

                                  Und jetzt kommt etwas, was ich noch nicht verstehe.

                                  1. ist der Connectionname first, wie in diesem Beispiel sagt mir db.lastError() Unable to connect (Access denied for user)
                                  2. ist der Connectionname aber qt_sql_default_connection, funktioniert alles wie gewünscht.
                                  3. Egal ob Access denied kommt oder nicht ein db.open ist immer True? Ich hätte jetzt erwartet das ein db.open False ist, da ich ja auch ein Access denied bekomme.

                                  Kann mir jemand diese drei dinge erklären warum das so ist?

                                  Gruß Knasan

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

                                  @knasan

                                  1. Sollte funktionieren. Der Benutzername "root" sieht aber verdächtig aus: man sollte sich nicht mit so einem Benutzer zu einer Datenbank verbinden! Ich vermute, dass der Server Verbindungen mit diesem Benutzer übers Netzwerk verhindert.
                                  2. Ich würde die statische Variable "db" entfernen, da diese ja völlig überflüssig ist - man bekommt ja die Verbindung mit QSqlDatabase::database("first")
                                  3. open() sollte im Fehlerfall false zurückgeben

                                  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