Как обрабатывать соединения с базой данных в Qt? - PullRequest
5 голосов
/ 27 сентября 2010

Вот моя проблема;в таком случае он жалуется на дубликаты соединений с тем же именем соединения:

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();
}

Вот мое решение:

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-) Это хороший способ решить эту проблему?

2-) У вас есть другое предложение?

3-) Считаете ли вы, что это недостаток для Qt?

Ответы [ 2 ]

1 голос
/ 27 сентября 2010
  1. -
  2. Я бы предпочел добавить соединение с БД в часть кода static.Не выполняется каждый раз, когда Test класс инициализируется.У вас может быть функция setup для обработки всей этой работы.
  3. Нет, это не так.Это по замыслу.Обычно вам не нужно создавать / открывать новое соединение с БД каждый раз, когда вы создаете экземпляр класса.
0 голосов
/ 28 сентября 2010

Просто дайте своим соединениям разные имена:

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();
}
...