2010-02-23 26 views
14

Estoy pensando en usar SQLite como base de datos para una aplicación de C++ que estoy escribiendo. He leído los documentos pertinentes tanto en el sitio trolltech como en sqlite, pero la información parece un tanto inconexa, no hay un fragmento simple que muestre un ejemplo completo de CRUD.Uso de SQLite con Qt

Quiero escribir un conjunto de funciones de ayuda para permitirme ejecutar acciones CRUD en SQLite fácilmente, desde mi aplicación.

El siguiente smippet es un seudocódigo para las funciones de ayuda que preveo escribir. Agradecería las sugerencias sobre cómo "llenar" las funciones de código auxiliar. Una cosa que es particularmente frustrante es que no hay una mención clara en ninguno de los documentos, en la relación entre una consulta y la base de datos en la que se está ejecutando la consulta, lo que sugiere algún tipo de conexión/tabla por defecto.

En mi aplicación, necesito poder especificar explícitamente la base de datos en la que se ejecutan las consultas, por lo que sería útil si alguna respuesta explica cómo especificar explícitamente la base de datos/tabla involucrada en una consulta (u otra base de datos acción para ese asunto).

Mi pseudocódigo sigue a continuación:

#include <boost/shared_ptr.hh> 

typedef boost::shared_ptr<QSqlDatabase> dbPtr; 


dbPtr createConnection(const QString& conn_type = "QSQLITE", const QString& dbname = ":memory:") 
{ 
    dbPtr db (new QSQlDatabase::QSqlDatabase()); 

    if (db.get()) 
    { 
     db->addDatabase(conn_type); 
     db->setDatabaseName(dbname); 

     if (!db.get()->open) 
      db.reset(); 
    } 

    return db; 
} 

bool runQuery(const Qstring& sql) 
{ 
    //How does SQLite know which database to run this SQL statement against ? 
    //How to iterate over the results of the run query? 
} 

bool runPreparedStmtQuery(const QString query_name, const QString& params) 
{ 
    //How does SQLite know which database to run this SQL statement against ? 
    //How do I pass parameters (say a comma delimited list to a prepared statement ? 
    //How to iterate over the results of the run query? 
} 

bool doBulkInsertWithTran(const Qstring& tablename, const MyDataRows& rows) 
{ 
    //How does SQLite know which database to run this SQL statement against ? 
    //How to start/commit|rollback 
} 

En caso de que lo que estoy pidiendo no es clara, estoy pidiendo lo que sería el wat correcta para aplicar cada una de las funciones anteriores (posiblemente con la excepción de la primero, a menos que se pueda mejorar, por supuesto).

[Editar]

pregunta clarificada mediante la eliminación de requisito de especificar explícitamente una tabla (esto ya se realiza en la consulta SQL - Se me olvidó Gracias por señalarlo Tom

Respuesta

16

Por defecto, Qt. utiliza la base de datos predeterminada de la aplicación para ejecutar consultas. Esta es la base de datos que se agregó usando el nombre de conexión predeterminado. Consulte el Qt documentation para obtener más información. No estoy seguro de qué quiere decir con la tabla de base de datos predeterminada, ya que la tabla para operar es normalmente especificado en la consulta en sí?

Para responder a su pregunta, aquí hay una implementación de uno de sus métodos. Tenga en cuenta que, en lugar de devolver un bool, devolvería una instancia de QSqlQuery para poder repetir los resultados de una consulta.

QSqlQuery runQuery(const Qstring& sql) 
{ 
    // Implicitly uses the database that was added using QSqlDatabase::addDatabase() 
    // using the default connection name. 
    QSqlQuery query(sql); 
    query.exec(); 
    return query; 
} 

Se podría utilizar esto como sigue:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setHostName("localhost"); 
db.setDatabaseName("data.db"); 
if (!db.open()) 
{ 
    raise ... 
} 

QSqlQuery query = runQuery("SELECT * FROM user;"); 
while (query.next()) 
{ 
    ... 
} 

Tenga en cuenta que también es posible especificar explícitamente qué base de datos de una consulta debe realizarse especificando explícitamente la correspondiente QSqlDatabase ejemplo como el segundo parámetro para QSqlQuery el constructor:

QSqlDatabase myDb; 
... 
QSqlQuery query = QSqlQuery("SELECT * FROM user;", myDb); 
... 
+0

descubrí que también puedes ejecutivo clall() directamente en el objeto QSqlDatabase, para ejecutar una consulta. Por supuesto, esto solo se puede usar cuando no se ejecutan declaraciones preparadas. Sigue leyendo sobre declaraciones preparadas. –

+2

¿Qué tal las declaraciones preparadas ...? –