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