2010-02-22 26 views
6

Intento tratar con la base de datos SQLite en Qt 4.5.3 en Linux. Ya he creado el databsae.Seleccionar de SQLite con Qt

Entonces, trato de realizar operaciones de selección en Qt:

db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName(filename); // Here is FULL path to the database. I've checked it twice :) 
bool ok = db.open(); 
qDebug() << db.tables(); 

QSqlQuery query; 
query.exec("select * from lessons"); 
qDebug() << query.size(); 
qDebug() << query.isSelect(); 
qDebug() << query.isValid(); 

Pero consola de depuración dice:

("lessons", "weeklessons", "weeks") 
-1 
true 
false 

Por qué es selecto nada? ¿Qué estoy haciendo mal?

+4

Parece que .size() no funciona con SQLite :(Es por eso que tiene -1 – Seba

Respuesta

0

Sin saber mucho sobre Qt, me estaba haciendo una pregunta: ¿cómo sabe el QSqlQuery qué conexión usar? Buscando que en el manual reveló que existen básicamente dos posibilidades para ejecutar una consulta:

  1. query = db.exec("select * from lessons");
    utilizando la conexión de base de datos, y desde allí executing.
  2. QSqlQuery query(db);
    La construcción de la consulta mediante el existing database y después de ejecutar la consulta:
    query.exec("select * from lessons");

edición: Después de leer un poco más, parece que las conexiones por defecto son compatibles, por lo que su ejemplo debería funcionar ...

¿Podría intentar pasar la consulta como el valor del constructor? Tal vez funcione entonces.

QSqlQuery query("select * from lessons"); 
+0

Qt hace que sea como "conexión predeterminada" Sí.. , por supuesto, traté de hacerlo de esta manera. No, los mismos errores. db = QSqlDatabase :: addDatabase ("QSQLITE"); db.setDatabaseName (nombre de archivo); bool ok = db.open(); qDebug() << db.tables(); QSqlQuery query = db.exec ("seleccionar * de lecciones"); qDebug() << query.size(); resultado: ("lessons", "weeklessons", "weeks") -1 – vas3k

+0

Y traté de agregar la consulta al valor del constructor. Los mismos errores, no funcionan también. Muy extraño :( – vas3k

3

En su "consulta QSqlQuery;" declaración, debe especificar la conexión de la base de datos, p. "Consulta QSqlQuery (db)"

1

Teniendo en cuenta que el programa informa de que la consulta no es válida, tiene una mirada en el mensaje de error de la siguiente manera:

QDebug() << query.lastError().text(); 

Esto debería ayudar a depurar el problema.

+0

Gracias por la respuesta, sí lo sé. Pero muestra una cadena vacía (solo un espacio): ("lecciones", "semanas de semana", "semanas") "" -1 – vas3k

+0

¿Estás seguro de que consulta en realidad funciona? Pruébalo desde el prompt SQLite. Tal vez sería útil agregar un punto y coma al final de la consulta? Finalmente, trataría de obtener el ejemplo SQLite que se incluye con Qt para que funcione. –

+0

Sí, funciona en mi SQLite Visor: http://lh3.ggpht.com/_hyIyDtqe5N0/S4KNBpfapeI/AAAAAAAAAU0/3MEliEIy8G4/sqlite2.png Agregar punto y coma no ayudó también. ¿Y dónde puedo encontrar ejemplos de Qt SQLite? Encontré solo MySQL. – vas3k

9

El método isValid() devuelve verdadero si la consulta está colocada en un registro válido, pero después de llamar a exec(), no lo es: primero tiene que pasar a un registro válido, por ejemplo con query.first () o query.next(). docs Ver Qt: http://doc.qt.io/archives/4.6/qsqlquery.html

el tamaño() devolviendo -1 no quiere decir que no hay ningún resultado: SQLite es una de las bases de datos para los que el tamaño de la consulta no está directamente disponible (busque en la documentación para QSqlDriver :: hasFeature()). Puede verificar que se devuelvan las filas y encontrar el tamaño con un bucle y query.next().

Dependiendo de lo que desee hacer con el resultado de su selección, también podría usar QSqlQueryModel en lugar de QSqlQuery.

+0

Parece el problema. @ vas3k en general, debe verificar el valor de retorno de exec() para ver si la ejecución de la consulta fue exitosa. –