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