Qt
SQL på Qt
Sök…
Grundläggande anslutning och fråga
Klassen QSqlDatabase tillhandahåller ett gränssnitt för åtkomst till en databas via en anslutning. En instans av QSqlDatabase representerar anslutningen. Anslutningen ger åtkomst till databasen via en av de stödda databasdrivrutinerna. Se till att lägga till
QT += SQL
i .pro-filen. Anta en SQL DB med namnet TestDB med ett landstabell som innehåller nästa kolumn:
| country |
-----------
| USA |
För att fråga och få SQL-data från 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();
}
Qt SQL-frågeparametrar
Det är ofta bekvämt att separera SQL-frågan från de verkliga värdena. Detta kan göras med platshållare. Qt stöder två platshållarsyntaxer: namngiven bindning och positionsbindning.
namngivna bindande:
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();
positionsbindning:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Thad Beaumont");
query.addBindValue(65000);
query.exec();
Observera att innan du ringer bindValue()
eller addBindValue()
måste du ringa QSqlQuery :: Prepar () en gång.
MS SQL Server-databasanslutning med QODBC
Se till när du försöker öppna en databasanslutning med QODBC
- Du har QODBC-drivrutin tillgänglig
- Din server har ett ODBC-gränssnitt och är aktiverat (detta beror på dina ODBC-drivrutinsinstallationer)
- använd delad minnesåtkomst, TCP / IP-anslutningar eller namngivna röranslutning.
Alla anslutningar kräver att databasnamnet endast ställs in genom att ringa QSqlDatabase :: setDatabaseName.
Öppna anslutning med delad minnesåtkomst
För att detta alternativ ska fungera måste du ha åtkomst till maskinens minne och måste ha behörigheter för att komma åt delat minne. För att använda en delad minnesanslutning krävs att du ställer in lpc: framför serversträngen. Anslutning med SQL Server Native Client 11 görs på följande sätt:
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");
}
Öppna anslutning med Named Pipe
Detta alternativ kräver att din ODBC-anslutning har en fullständig DSN. Serversträngen konfigureras med Windows Computname och SQL Server-instansnamnet. Exempelanslutningen öppnas med 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");
}
Öppna anslutning med TCP / IP
För att öppna en TCP / IP-anslutning borde servern konfigureras så att anslutningar kan göras på en fast port, annars måste du först fråga efter den nuvarande aktiva porten. I det här exemplet har vi en fast port på 5171. Du kan hitta ett exempel för att ställa in servern för att tillåta anslutningar på en fast port vid 1 . För att öppna en anslutning med TCP / IP använder du en tupel av servrarna IP och 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");
}