Поиск…


Основное подключение и запрос

Класс QSqlDatabase предоставляет интерфейс для доступа к базе данных через соединение. Экземпляр QSqlDatabase представляет соединение. Соединение обеспечивает доступ к базе данных через один из поддерживаемых драйверов базы данных. Обязательно добавьте

QT += SQL 

в файле .pro. Предположим, что SQL DB с именем TestDB с countryTable, которая охватывает следующий столбец:

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

Чтобы запросить и получить sql-данные из 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

Часто бывает удобно отделить запрос SQL от фактических значений. Это можно сделать с помощью заполнителей. Qt поддерживает два синтаксиса-заполнителя: именованное связывание и позиционное связывание.

имя привязки:

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

позиционная привязка:

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

Обратите внимание, что перед вызовом bindValue() или addBindValue() вам нужно вызвать QSqlQuery :: prepare () один раз.

Подключение базы данных MS SQL Server с использованием QODBC

При попытке открыть соединение с базой данных с QODBC, пожалуйста,

  • У вас есть драйвер QODBC
  • Ваш сервер имеет интерфейс ODBC и включен (это зависит от установки драйвера ODBC)
  • использовать доступ к общей памяти, соединения TCP / IP или именованное соединение с каналом.

Для всех соединений требуется, чтобы имя базы данных было задано путем вызова QSqlDatabase :: setDatabaseName.


Открыть соединение с использованием доступа к общей памяти

Чтобы эта опция работала, вам необходимо иметь доступ к памяти компьютера и иметь разрешения на доступ к общей памяти. Для использования соединения с общей памятью необходимо установить lpc: перед строкой сервера. Соединение с использованием собственного клиента SQL Server 11 выполняется с помощью следующих действий:

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

Открыть соединение с использованием именованной трубы

Эта опция требует, чтобы ваше соединение ODBC имело полный DSN. Строка сервера настраивается с использованием имени компьютера и имени компьютера SQL Server. Пример подключения будет открыт с использованием собственного клиента SQL Server 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");
}

Открыть соединение с использованием TCP / IP

Для открытия TCP / IP-соединения сервер должен быть настроен так, чтобы разрешать подключения на фиксированном порту, иначе вам сначала нужно будет запросить текущий активный порт. В этом примере у нас есть фиксированный порт на 5171. Вы можете найти пример настройки сервера для разрешения соединений на фиксированном порту в 1 . Для открытия соединения с использованием TCP / IP используйте кортеж серверов IP и 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");
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow