0

我用来QSqlDatabase向mysql插入数据。

首先,我定义了一个名为的类Inserter

class Inserter
{
    QSqlDatabase db_connection;
    
public:
    Insert()
    {
        db_connection = QSqlDatabase::addDatabase("QMYSQL");

        db_connection.setDatabaseName("dbname");

        db_connection.setHostName("localhost");

        db_connection.setUserName("root");

        db_connection.setPassword("psd");

        if(!db_connection.open())
        {
            qDebug() << db_connection.lastError();
        }
    }
};

然后,我Insert在另一个定义为调度程序的类中使用:

class Scheduler
{
    Inserter inserter;
public:
    Scheduler()
    {
        inserter = Inserter();
    }
};

当我运行这个程序时,Qt 打印警告:

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' 仍在使用中,所有查询都将停止工作。

QSqlDatabasePrivate::addDatabase: 重复连接名称 'qt_sql_default_connection',旧连接已删除。

有人说:

QSqlDatabase::addDatabase() 应该每个类型和连接名称调用一次。多次调用 addDatabase("QMYSQL") 会导致QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

此外,在删除数据库时拥有现有的 QSqlQuery 对象会导致QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.

如果上述警告的原因是正确的,为什么警告的顺序不是:

QSqlDatabasePrivate::addDatabase: 重复连接名称 'qt_sql_default_connection',旧连接已删除。

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' 仍在使用中,所有查询都将停止工作。

最后,我将初始代码移动到类Scheduler中,如下所示:

class Scheduler
{
    QSqlDatabase db_connection;
  
    void initDBConnection()
    {
        db_connection = QSqlDatabase::addDatabase("QMYSQL");

        db_connection.setDatabaseName("walmart");

        db_connection.setHostName("localhost");

        db_connection.setUserName("root");

        db_connection.setPassword("");
 
        if(!db_connection.open())
        {
            qDebug() << db_connection.lastError();
        }
    }

public:
    Scheduler()
    {
        initDBConnection();
    }
}; 

没有打印警告或错误。

4

0 回答 0