5

Voici mon problème; dans un tel cas, il se plaint de connexions en double avec le même nom de connexion:Comment gérer les connexions de base de données dans 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(); 
} 

Voici ma solution:

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-) Est-ce une bonne façon de gérer ce problème?

2-) Avez-vous une autre suggestion? 3-) Pensez-vous que cela soit un inconvénient pour Qt?

Répondre

1
  1. -
  2. je préférerais ajouter la connexion de base de données dans une partie static de code. Non exécutable à chaque fois Test la classe est initialisée. Vous pouvez avoir une fonction setup pour gérer tout ce travail.
  3. Non, ce n'est pas le cas. C'est par conception. Habituellement, vous ne devriez pas avoir à créer/ouvrir une nouvelle connexion DB chaque fois que vous créez une instance de classe.
+0

Pour 2: Et si j'ai des classes séparées qui utilisent même nom de connexion pour la base de données se connecter? – metdos

+0

Pour 3: je lui ressemble à variable globale, est-ce une sorte de mauvais usage, n'est ce pas? – metdos

+0

@metdos: Pour 2: vous pouvez passer le handle de la BD au lieu de passer le nom de la connexion. Ou, passez le nom de la connexion, mais ne l'ajoutez pas, récupérez simplement la connexion par son nom à partir de QSqlDatabase. –

0

Il suffit de donner vos connexions différentes: nom

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

Dans le cas de l'utilisation de bibliothèques indépendantes simultanément, comment pouvons-nous empêcher d'utiliser le même nom de connexion? – metdos

+0

Si vous n'avez pas accès au code source, je ne pense pas que vous puissiez empêcher deux bibliothèques d'utiliser le même nom de connexion. Mais vous pourriez déposer un rapport de bogue avec les développeurs des deux bibliothèques suggérant qu'ils utilisent des noms uniques. – PiedPiper