データベースへの接続

QSqlQuery またはQSqlQueryModel を使ってデータベースにアクセスするには、1つ以上のデータベース接続を作成し、開きます。データベース接続は通常、データベース名ではなく接続名で識別されます。QSqlDatabase では、名前のない接続であるデフォルト接続の概念もサポートしています。接続名の引数を取るQSqlQuery またはQSqlQueryModel メンバ関数を呼び出す際、接続名を渡さなければデフォルト接続が使用されます。デフォルト接続の作成は、アプリケーションでデータベース接続が1つしか必要ない場合に便利です。

接続の作成とオープンの違いに注意してください。接続を作成するには、QSqlDatabase クラスのインスタンスを作成します。接続は開くまで使用できません。以下のスニペットは、デフォルトの接続を作成し、それを開く方法を示しています:

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("bigblue");
    db.setDatabaseName("flightdb");
    db.setUserName("acarlson");
    db.setPassword("1uTbSbAs");
    bool ok = db.open();

最初の行で接続オブジェクトを作成し、最後の行でそれをオープンして使用しています。その間に、database namehost nameuser namepassword などの接続情報を初期化しています。この場合、ホストbigblue 上の MySQL データベースflightdb に接続しています。addDatabase() の引数"QMYSQL" は、接続に使用するデータベース・ドライバのタイプを指定します。Qt に含まれるデータベースドライバは、サポートされているデータベースドライバの表に示されています。

このスニペットの接続はデフォルトの接続になります。これは、addDatabase() の第2引数に接続名を渡していないからです。例えば、ここでは"first""second" という名前の2つのMySQLデータベース接続を確立します:

    QSqlDatabase firstDB = QSqlDatabase::addDatabase("QMYSQL", "first");
    QSqlDatabase secondDB = QSqlDatabase::addDatabase("QMYSQL", "second");

これらの接続が初期化された後、open() をそれぞれ実行し、接続を確立する。open() が失敗すると、false が返される。この場合、QSqlDatabase::lastError ()を呼び出してエラー情報を取得する。

接続が確立されると、接続名を指定して静的関数QSqlDatabase::database() をどこからでも呼び出すことができ、そのデータベース接続へのポインタを取得できます。接続名を渡さなければ、デフォルトの接続が返されます。例えば

    QSqlDatabase defaultDB = QSqlDatabase::database();
    QSqlDatabase firstDB = QSqlDatabase::database("first");
    QSqlDatabase secondDB = QSqlDatabase::database("second");

データベース接続を削除するには、まずQSqlDatabase::close() を使ってデータベースを閉じ、次に静的メソッドQSqlDatabase::removeDatabase() を使って削除します。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.