5

Hier mein Problem; in einem solchen Fall klagt es über doppelte Verbindungen mit dem gleichen Verbindungsname:Wie behandelt man Datenbankverbindungen in Qt?

Test::Test(QString connectionName) 
{ 
    db=QSqlDatabase::addDatabase("QMYSQL",connectionName); 
} 

int main(int argc, char *argv[]) 
{ 
    QString connectionName=QString("test"); 
    QCoreApplication a(argc, argv); 

    Test myDb(connectionName); 
    Test myDb2(connectionName); 

    return a.exec(); 
} 

Hier ist meine Lösung:

Test::Test(QString connectionName) 
    { 
     if(!QSqlDatabase::contains(connectionName)) 
      db=QSqlDatabase::addDatabase("QMYSQL",connectionName); 
     else 
      db=QSqlDatabase::database(connectionName); 
    } 

    int main(int argc, char *argv[]) 
    { 
     QString connectionName=QString("test"); 
     QCoreApplication a(argc, argv); 
     { 
      Test myDb(connectionName); 
      Test myDb2(connectionName); 
     } 
     QSqlDatabase::removeDatabase(connectionName); 

     return a.exec(); 
    } 

1-) Ist dies ein guter Weg, um dieses Problem zu umgehen?

2-) Haben Sie einen anderen Vorschlag?

3-) Denken Sie, dass dies ein Nachteil für Qt ist?

Antwort

1
  1. -
  2. Ich würde es vorziehen, die Datenbankverbindung in einem static Teil des Codes hinzufügen. Nicht immer ausgeführt Test Klasse ist initialisiert. Sie können eine setup Funktion haben, um all diese Arbeit zu erledigen.
  3. Nein, ist es nicht. Es ist von Entwurf. Normalerweise sollten Sie nicht jedes Mal, wenn Sie eine Klasseninstanz erstellen, eine neue DB-Verbindung erstellen/öffnen.
+0

für 2: Was passiert, wenn ich verschiedene Klassen haben, die um denselben Verbindungsnamen verwenden Datenbank zu verbinden? – metdos

+0

Für 3: Ich ähnele es der globalen Variable, ist es eine Art von schlechter Nutzung, nicht wahr? – metdos

+0

@metdos: Für 2: Sie können den DB-Handle übergeben, anstatt den Verbindungsnamen zu übergeben. Oder übergeben Sie den Verbindungsnamen, aber fügen Sie ihn nicht hinzu, rufen Sie die Verbindung einfach über den Namen von QSqlDatabase ab. –

0

einfach Ihre Verbindungen unterschiedliche Namen geben:

int main(int argc, char *argv[]) 
{ 
    QString connectionName("test"); 
    QString connectionName2("test2"); 
    QCoreApplication a(argc, argv); 

    Test myDb(connectionName); 
    Test myDb2(connectionName2); 

    return a.exec(); 
} 
+0

Bei Verwendung von unabhängigen Bibliotheken gleichzeitig, wie können wir die Verwendung desselben Verbindungsnamens verhindern? – metdos

+0

Wenn Sie keinen Zugriff auf den Quellcode haben, können Sie nicht verhindern, dass zwei Bibliotheken denselben Verbindungsnamen verwenden. Aber Sie könnten einen Fehlerbericht mit den Entwicklern beider Bibliotheken einreichen, der vorschlägt, dass sie eindeutige Namen verwenden. – PiedPiper

Verwandte Themen