Ricerca…


Connessione di base e query

La classe QSqlDatabase fornisce un'interfaccia per l'accesso a un database tramite una connessione. Un'istanza di QSqlDatabase rappresenta la connessione. La connessione fornisce l'accesso al database tramite uno dei driver di database supportati. Assicurati di aggiungere

QT += SQL 

nel file .pro. Si supponga che un DB SQL denominato TestDB con un countryTable contine la colonna successiva:

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

Per interrogare e ottenere dati SQL da 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();
}

Parametri di query Qt SQL

Spesso è conveniente separare la query SQL dai valori effettivi. Questo può essere fatto usando i segnaposti. Qt supporta due sintassi segnaposto: binding con nome e binding posizionale.

named binding:

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

vincolo posizionale:

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

Si noti che prima di chiamare bindValue() o addBindValue() è necessario chiamare QSqlQuery :: prepare () una volta.

Connessione al database MS SQL Server tramite QODBC

Quando si tenta di aprire una connessione al database con QODBC, assicurarsi

  • È disponibile il driver QODBC
  • Il tuo server ha un'interfaccia ODBC ed è abilitato (dipende dalle installazioni del tuo driver ODBC)
  • utilizzare l'accesso alla memoria condivisa, connessioni TCP / IP o named pipe connection.

Tutte le connessioni richiedono solo che DatabaseName sia impostato chiamando QSqlDatabase :: setDatabaseName.


Apri connessione utilizzando l'accesso alla memoria condivisa

Affinché questa opzione funzioni, è necessario avere accesso alla memoria della macchina e disporre delle autorizzazioni per accedere alla memoria condivisa. Per utilizzare una connessione di memoria condivisa è necessario impostare lpc: davanti alla stringa del server. La connessione che utilizza SQL Server Native Client 11 viene effettuata utilizzando questi passaggi:

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

Apri connessione usando Named Pipe

Questa opzione richiede che la tua connessione ODBC abbia un DSN completo. La stringa del server viene configurata utilizzando il nomecomputer di Windows e il nome istanza di SQL Server. La connessione di esempio verrà aperta utilizzando 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");
}

Apri connessione tramite TCP / IP

Per aprire una connessione TCP / IP il server deve essere configurato per consentire le connessioni su una porta fissa, altrimenti sarà necessario prima eseguire una query per la porta attualmente attiva. In questo esempio abbiamo una porta fissa su 5171. È possibile trovare un esempio per configurare il server per consentire le connessioni su una porta fissa su 1 . Per aprire una connessione utilizzando TCP / IP utilizzare una tupla dei server IP e Porta:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow