Szukaj…


Podstawowe połączenie i zapytanie

Klasa QSqlDatabase zapewnia interfejs umożliwiający dostęp do bazy danych za pośrednictwem połączenia. Instancja QSqlDatabase reprezentuje połączenie. Połączenie zapewnia dostęp do bazy danych za pośrednictwem jednego z obsługiwanych sterowników bazy danych. Pamiętaj, aby dodać

QT += SQL 

w pliku .pro. Załóżmy SQL DB o nazwie TestDB z countryTable, która zawiera następną kolumnę:

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

Aby wysłać zapytanie i uzyskać dane SQL z 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();
}

Parametry zapytania Qt SQL

Często wygodnie jest oddzielić zapytanie SQL od rzeczywistych wartości. Można to zrobić za pomocą symboli zastępczych. Qt obsługuje dwie składnie zastępcze: wiązanie nazwane i wiązanie pozycyjne.

nazwane wiązanie:

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

wiązanie pozycyjne:

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

Zauważ, że przed wywołaniem bindValue() lub addBindValue() musisz wywołać QSqlQuery :: preparat () jeden raz.

Połączenie z bazą danych MS SQL Server przy użyciu QODBC

Przy próbie otwarcia połączenia z bazą danych za pomocą QODBC upewnij się

  • Masz dostępny sterownik QODBC
  • Twój serwer ma interfejs ODBC i jest włączony (zależy to od instalacji sterowników ODBC)
  • użyj dostępu do pamięci współużytkowanej, połączeń TCP / IP lub połączenia nazwanego potoku.

Wszystkie połączenia wymagają jedynie ustawienia DatabaseName poprzez wywołanie QSqlDatabase :: setDatabaseName.


Otwórz połączenie za pomocą dostępu do pamięci współużytkowanej

Aby ta opcja działała, musisz mieć dostęp do pamięci urządzenia i mieć uprawnienia dostępu do pamięci współdzielonej. Aby korzystać z połączenia z pamięcią współużytkowaną, należy ustawić lpc: przed ciągiem serwera. Połączenie za pomocą SQL Server Native Client 11 jest nawiązywane przy użyciu następujących kroków:

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

Otwórz połączenie za pomocą potoku nazwanego

Ta opcja wymaga, aby połączenie ODBC posiadało pełną nazwę DSN. Ciąg serwera jest konfigurowany przy użyciu nazwy komputera Windows i nazwy instancji serwera SQL. Przykładowe połączenie zostanie otwarte za pomocą 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");
}

Otwórz połączenie za pomocą TCP / IP

Aby otworzyć połączenie TCP / IP, serwer należy skonfigurować tak, aby zezwalał na połączenia na stałym porcie, w przeciwnym razie najpierw trzeba zapytać o aktualnie aktywny port. W tym przykładzie mamy stały port na 5171. Możesz znaleźć przykład konfiguracji serwera, aby zezwalał na połączenia na stałym porcie na 1 . Aby otworzyć połączenie za pomocą protokołu TCP / IP, użyj krotki adresów IP i portów serwerów:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow