0

私はQSqlDatabasemysqlにデータを挿入するために使用します。

まず、次の名前のクラスを定義します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();
        }
    }
};

そして、InsertScheduler として定義された別のクラスで使用します。

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

このプログラムを実行すると、Qt が警告を出力します。

QSqlDatabasePrivate::removeDatabase: 接続 'qt_sql_default_connection' はまだ使用中です。すべてのクエリが機能しなくなります。

QSqlDatabasePrivate::addDatabase: 重複する接続名 'qt_sql_default_connection'、古い接続が削除されました。

誰かが言った:

QSqlDatabase::addDatabase() は、タイプと接続名ごとに 1 回呼び出されることになっています。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: 接続 '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