Buscar..


Conexión básica y consulta.

La clase QSqlDatabase proporciona una interfaz para acceder a una base de datos a través de una conexión. Una instancia de QSqlDatabase representa la conexión. La conexión proporciona acceso a la base de datos a través de uno de los controladores de base de datos compatibles. Asegúrese de añadir

QT += SQL 

en el archivo .pro. Supongamos una base de datos SQL llamada TestDB con una tabla de país que contine la siguiente columna:

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

Para consultar y obtener datos SQL de 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();
}

Parámetros de consulta Qt SQL

A menudo es conveniente separar la consulta SQL de los valores reales. Esto se puede hacer utilizando marcadores de posición. Qt admite dos sintaxis de marcador de posición: enlace con nombre y enlace posicional.

encuadernación nombrada

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

unión posicional

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

Tenga en cuenta que antes de llamar a bindValue() o addBindValue() debe llamar a QSqlQuery :: prepare () una vez.

Conexión de base de datos de MS SQL Server utilizando QODBC

Cuando intente abrir una conexión de base de datos con QODBC, asegúrese de

  • Tienes el controlador QODBC disponible
  • Su servidor tiene una interfaz ODBC y está habilitado para (esto depende de sus instalaciones de controlador ODBC)
  • use el acceso a la memoria compartida, las conexiones TCP / IP o la conexión de tubería con nombre.

Todas las conexiones solo requieren que el nombre de la base de datos se establezca llamando a QSqlDatabase :: setDatabaseName.


Conexión abierta mediante acceso a memoria compartida

Para que esta opción funcione, deberá tener acceso a la memoria de la máquina y debe tener permisos para acceder a la memoria compartida. Para utilizar una conexión de memoria compartida, es necesario configurar lpc: delante de la cadena del servidor. La conexión mediante el SQL Server Native Client 11 se realiza mediante estos pasos:

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

Conexión abierta usando una tubería con nombre

Esta opción requiere que su conexión ODBC tenga un DSN completo. La cadena del servidor se configura mediante el nombre de computadora de Windows y el nombre de instancia del servidor SQL. La conexión de ejemplo se abrirá utilizando 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");
}

Conexión abierta usando TCP / IP

Para abrir una conexión TCP / IP, el servidor debe configurarse para permitir conexiones en un puerto fijo, de lo contrario, primero deberá consultar el puerto activo actual. En este ejemplo, tenemos un puerto fijo en 5171. Puede encontrar un ejemplo para configurar el servidor para permitir conexiones en un puerto fijo en 1 . Para abrir una conexión usando TCP / IP, use una tupla de los servidores IP y Puerto:

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow