Suche…


Grundlegende Verbindung und Abfrage

Die QSqlDatabase- Klasse bietet eine Schnittstelle für den Zugriff auf eine Datenbank über eine Verbindung. Eine Instanz von QSqlDatabase repräsentiert die Verbindung. Die Verbindung ermöglicht den Zugriff auf die Datenbank über einen der unterstützten Datenbanktreiber. Stellen Sie sicher, dass Sie hinzufügen

QT += SQL 

in der .pro-Datei. Nehmen wir an, eine SQL-Datenbank namens TestDB mit einer countryTable, die die nächste Spalte enthält:

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

Um SQL-Daten von TestDB abzufragen und abzurufen:

#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-Abfrageparameter

Es ist oft praktisch, die SQL-Abfrage von den tatsächlichen Werten zu trennen. Dies kann mit Platzhaltern erfolgen. Qt unterstützt zwei Platzhaltersyntaxen: Benannte Bindung und Positionsbindung.

benannte Bindung:

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

Positionsbindung:

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

Beachten Sie, dass Sie vor dem Aufruf von bindValue() oder addBindValue() () einmal QSqlQuery :: addBindValue() aufrufen müssen .

MS SQL Server-Datenbankverbindung mit QODBC

Stellen Sie beim Versuch, eine Datenbankverbindung mit QODBC zu öffnen, sicher

  • Sie haben QODBC-Treiber zur Verfügung
  • Ihr Server verfügt über eine ODBC-Schnittstelle und ist aktiviert (dies hängt von Ihren ODBC-Treiberinstallationen ab).
  • Verwenden Sie Shared Memory-Zugriff, TCP / IP-Verbindungen oder Named Pipe-Verbindungen.

Für alle Verbindungen muss der DatabaseName nur durch Aufruf von QSqlDatabase :: setDatabaseName festgelegt werden.


Öffnen Sie die Verbindung mit Shared Memory-Zugriff

Damit diese Option funktioniert, müssen Sie Zugriff auf den Arbeitsspeicher des Computers haben und über Berechtigungen zum Zugriff auf den gemeinsam genutzten Speicher verfügen. Für die Verwendung einer Shared Memory-Verbindung muss lpc: vor der Serverzeichenfolge festgelegt werden. Die Verbindung mit dem SQL Server Native Client 11 wird mithilfe der folgenden Schritte hergestellt:

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

Öffnen Sie die Verbindung mit Named Pipe

Für diese Option muss Ihre ODBC-Verbindung über einen vollständigen DSN verfügen. Die Serverzeichenfolge wird mit dem Windows-Computername und dem Instanznamen des SQL-Servers eingerichtet. Die Beispielverbindung wird mit SQL Server Native Client 10.0 geöffnet

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

Öffnen Sie die Verbindung über TCP / IP

Zum Öffnen einer TCP / IP-Verbindung muss der Server so konfiguriert sein, dass Verbindungen an einem festen Port zugelassen werden. Andernfalls müssen Sie zunächst den aktuell aktiven Port abfragen. In diesem Beispiel haben wir einen festen Port bei 5171. Sie finden ein Beispiel für das Einrichten des Servers, um Verbindungen an einem festen Port bei 1 zuzulassen. Um eine Verbindung über TCP / IP zu öffnen, verwenden Sie ein Tupel der IP-Adresse und des Ports des Servers:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow