Una mejor función (inspirada en el código fuente de Qt: http://qt.gitorious.org/qt/qt/blobs/4.7/src/sql/kernel/qsqlresult.cpp#line644).
Esta función debería manejar casi todos los casos: Este código no funciona con Oracle DB cuando se usa Enlace de nombre (Este es el único DB que admite nativamente Enlace de nombre => executeQuery() no devuelve la consulta con '?' Pero la consulta original ...)
para ser capaz de soportar el apoyo Nombre nativo unión de DB, las claves de valores de la envolvente debe ser ordenada por la longitud, a continuación, un bucle sobre el mapa ordenada ...
QString getLastExecutedQuery(const QSqlQuery& query)
{
QString sql = query.executedQuery();
const int nbBindValues = query.boundValues().size();
for(int i = 0, j = 0; j < nbBindValues; ++j)
{
i = sql.indexOf(QLatin1Char('?'), i);
if (i <= 0)
{
break;
}
const QVariant &var = query.boundValue(j);
QSqlField field(QLatin1String(""), var.type());
if (var.isNull())
{
field.clear();
}
else
{
field.setValue(var);
}
QString formatV = query.driver()->formatValue(field);
sql.replace(i, 1, formatV);
i += formatV.length();
}
return sql;
}
Editar: encontré un error en la función anterior, si un '?' existe dentro de una cadena citada, el '?' es reemplazado por el siguiente valor disponible. El error ya existe en el código fuente de Qt. Esta función debería solucionar este problema (se podría mejorar mucho, pero la idea está ahí)
QString getLastExecutedQuery(const QSqlQuery& query)
{
QString sql = query.executedQuery();
int nbBindValues = query.boundValues().size();
for(int i = 0, j = 0; j < nbBindValues;)
{
int s = sql.indexOf(QLatin1Char('\''), i);
i = sql.indexOf(QLatin1Char('?'), i);
if (i < 1)
{
break;
}
if(s < i && s > 0)
{
i = sql.indexOf(QLatin1Char('\''), s + 1) + 1;
if(i < 2)
{
break;
}
}
else
{
const QVariant &var = query.boundValue(j);
QSqlField field(QLatin1String(""), var.type());
if (var.isNull())
{
field.clear();
}
else
{
field.setValue(var);
}
QString formatV = query.driver()->formatValue(field);
sql.replace(i, 1, formatV);
i += formatV.length();
++j;
}
}
return sql;
}
me ocurrió con esta solución: 'QString getLastExecutedQuery (const QSqlQuery y consulta) { QString cadena = query.lastQuery(); QMapIterator it (query.boundValues ()); mientras (it.hasNext()) { it.next(); str.replace (it.key(), it.value(). ToString()); } return str; } ' –
lightstep
se debe eliminar el comentario y añadirlo como una respuesta. –
No puedo agregarlo como respuesta. ¡Uy! Su respuesta no pudo presentarse porque: Los nuevos usuarios no pueden responder a su propia pregunta durante 8 horas. Por favor use comentarios o edite su pregunta en su lugar. – lightstep