Recherche…


Connexion de base et requête

La classe QSqlDatabase fournit une interface pour accéder à une base de données via une connexion. Une instance de QSqlDatabase représente la connexion. La connexion permet d'accéder à la base de données via l'un des pilotes de base de données pris en charge. Assurez-vous d'ajouter

QT += SQL 

dans le fichier .pro. Supposons qu'une base de données SQL nommée TestDB avec un countryTable contienne la colonne suivante:

| country |
-----------
| USA     |

Pour interroger et obtenir des données SQL depuis TestDB:

#include <QtGui>
#include <QtSql>
 
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); // Will use the driver referred to by "QPSQL" (PostgreSQL Driver) 
    db.setHostName("TestHost");
    db.setDatabaseName("TestDB");
    db.setUserName("Foo");
    db.setPassword("FooPass");
    
    bool ok = db.open();
    if(ok)
    {
        QSqlQuery query("SELECT country FROM countryTable");
        while (query.next())
        {
          QString country = query.value(0).toString();
          qWarning() << country; // Prints "USA"
        }
    }

    return app.exec();
}

Paramètres de requête Qt SQL

Il est souvent pratique de séparer la requête SQL des valeurs réelles. Cela peut être fait en utilisant des espaces réservés. Qt prend en charge deux syntaxes d'espace réservé: la liaison nommée et la liaison de position.

liaison nommée:

QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) VALUES (:id, :name, :salary)");
query.bindValue(":id", 1001);
query.bindValue(":name", "Thad Beaumont");
query.bindValue(":salary", 65000);
query.exec();

liaison de position:

QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Thad Beaumont");
query.addBindValue(65000);
query.exec();

Notez qu'avant d'appeler bindValue() ou addBindValue() vous devez appeler QSqlQuery :: prepare () une fois.

Connexion à la base de données MS SQL Server à l'aide de QODBC

Lorsque vous essayez d'ouvrir une connexion de base de données avec QODBC, veuillez vous assurer que

  • Vous avez un pilote QODBC disponible
  • Votre serveur a une interface ODBC et est activé pour (cela dépend de vos installations de pilote ODBC)
  • utiliser l'accès à la mémoire partagée, les connexions TCP / IP ou la connexion par canal nommé.

Toutes les connexions nécessitent uniquement que DatabaseName soit défini en appelant QSqlDatabase :: setDatabaseName.


Ouvrir la connexion en utilisant l'accès à la mémoire partagée

Pour que cette option fonctionne, vous devez avoir accès à la mémoire de la machine et disposer des autorisations nécessaires pour accéder à la mémoire partagée. Pour utiliser une connexion en mémoire partagée, il est nécessaire de définir lpc: devant la chaîne du serveur. La connexion à l'aide de SQL Server Native Client 11 est effectuée en procédant comme suit:

QString connectString = "Driver={SQL Server Native Client 11.0};";                     // Driver is now {SQL Server Native Client 11.0}
connectString.append("Server=lpc:"+QHostInfo::localHostName()+"\\SQLINSTANCENAME;");   // Hostname,SQL-Server Instance
connectString.append("Database=SQLDBSCHEMA;");  // Schema
connectString.append("Uid=SQLUSER;");           // User
connectString.append("Pwd=SQLPASS;");           // Pass
db.setDatabaseName(connectString);

if(db.open())
{
    ui->statusBar->showMessage("Connected");
}
else
{
    ui->statusBar->showMessage("Not Connected");
}

Connexion ouverte à l'aide d'un tuyau nommé

Cette option nécessite que votre connexion ODBC ait un DSN complet. La chaîne du serveur est configurée à l'aide du Windows Computername et du nom de l'instance du serveur SQL. L'exemple de connexion sera ouvert à l'aide de SQL Server Native Client 10.0

QString connectString = "Driver={SQL Server Native Client 10.0};"; // Driver can also be {SQL Server Native Client 11.0}
connectString.append("Server=SERVERHOSTNAME\\SQLINSTANCENAME;");   // Hostname,SQL-Server Instance
connectString.append("Database=SQLDBSCHEMA;");  // Schema
connectString.append("Uid=SQLUSER;");           // User
connectString.append("Pwd=SQLPASS;");           // Pass
db.setDatabaseName(connectString);

if(db.open())
{
    ui->statusBar->showMessage("Connected");
}
else
{
    ui->statusBar->showMessage("Not Connected");
}

Ouvrir la connexion en utilisant TCP / IP

Pour ouvrir une connexion TCP / IP, le serveur doit être configuré pour autoriser les connexions sur un port fixe, sinon vous devrez d'abord interroger le port actuellement actif. Dans cet exemple, nous avons un port fixe à 5171. Vous pouvez trouver un exemple de configuration du serveur pour autoriser les connexions sur un port fixe à 1 . Pour ouvrir une connexion utilisant TCP / IP, utilisez un tuple des serveurs IP et Port:

QString connectString = "Driver={SQL Server};"; // Driver is now {SQL Server}
connectString.append("Server=10.1.1.15,5171;"); // IP,Port
connectString.append("Database=SQLDBSCHEMA;");  // Schema
connectString.append("Uid=SQLUSER;");           // User
connectString.append("Pwd=SQLPASS;");           // Pass
db.setDatabaseName(connectString);

if(db.open())
{
    ui->statusBar->showMessage("Connected");
}
else
{
    ui->statusBar->showMessage("Not Connected");
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow