Qt
SQL op Qt
Zoeken…
Basisverbinding en query
De klasse QSqlDatabase biedt een interface voor toegang tot een database via een verbinding. Een exemplaar van QSqlDatabase vertegenwoordigt de verbinding. De verbinding biedt toegang tot de database via een van de ondersteunde databasestuurprogramma's. Zorg ervoor dat u toevoegt
QT += SQL
in het .pro-bestand. Stel dat een SQL DB met de naam TestDB met een countryTable die de volgende kolom bevat:
| country |
-----------
| USA |
Om SQL-gegevens van TestDB op te vragen en te verkrijgen:
#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();
}
Qt SQL-queryparameters
Het is vaak handig om de SQL-query te scheiden van de werkelijke waarden. Dit kan met behulp van tijdelijke aanduidingen. Qt ondersteunt twee synoniemen voor plaatsaanduidingen: genaamd binding en positionele binding.
genaamd bindend:
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();
positionele binding:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Thad Beaumont");
query.addBindValue(65000);
query.exec();
Let op: voordat u bindValue()
of addBindValue()
moet u QSqlQuery :: prepar () één keer aanroepen.
MS SQL Server-databaseverbinding met QODBC
Zorg ervoor dat u probeert een databaseverbinding met QODBC te openen
- U hebt een QODBC-stuurprogramma beschikbaar
- Uw server heeft een ODBC-interface en is ingeschakeld om (dit hangt af van uw ODBC-stuurprogramma-installaties)
- gebruik gedeelde geheugentoegang, TCP / IP-verbindingen of een pipe-verbinding.
Voor alle verbindingen moet alleen de databasenaam worden ingesteld door QSqlDatabase :: setDatabaseName aan te roepen.
Open Verbinding met toegang tot gedeeld geheugen
Om deze optie te laten werken, moet u toegang hebben tot het geheugen van de machine en machtigingen hebben voor toegang tot het gedeelde geheugen. Voor het gebruik van een verbinding met gedeeld geheugen moet lpc: voor de serverreeks worden ingesteld. Verbinding met behulp van de SQL Server Native Client 11 wordt gemaakt met behulp van deze stappen:
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");
}
Open verbinding met behulp van Named Pipe
Voor deze optie moet uw ODBC-verbinding een volledige DSN hebben. De serverstring wordt ingesteld met behulp van de Windows-computernaam en de instantienaam van de SQL Server. De voorbeeldverbinding wordt geopend met 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");
}
Open verbinding met TCP / IP
Voor het openen van een TCP / IP-verbinding moet de server worden geconfigureerd om verbindingen op een vaste poort toe te staan, anders moet u eerst naar de momenteel actieve poort vragen. In dit voorbeeld hebben we een vaste poort op 5171. U kunt een voorbeeld vinden voor het instellen van de server om verbindingen op een vaste poort toe te staan op 1 . Gebruik voor het openen van een verbinding met TCP / IP een tuple van de servers IP en poort:
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");
}