更好的功能(受Qt源代码的启发:http://qt.gitorious.org/qt/qt/blobs/4.7/src/sql/kernel/qsqlresult.cpp#line644)。
该函数应该可以处理几乎所有的情况:当使用名称绑定(这是唯一支持本地名称绑定=> executionQuery()的数据库不会返回含'?'的查询时,此代码不适用于Oracle DB原来的查询......)
为了能够支持原生支持名称绑定DB的,绑定值的钥匙必须由长短进行排序,然后对有序地图环......
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;
}
编辑:我发现前一个函数的错误,如果'?'存在于引用的字符串中,'?'由下一个可用值取代。该错误已经存在于Qt源代码中。 这个功能应该可以解决这个问题(可能是提高了很多,但这个想法是有)
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;
}
我提出了以下解决方法: '的QString getLastExecutedQuery(常量QSqlQuery&查询) { QString的STR = query.lastQuery(); QMapIterator it(query.boundValues()); (it.hasNext()) { it.next(); str.replace(it.key(),it.value()。toString()); } return str; }' –
lightstep
2011-04-25 11:02:45
您应该删除评论并将其添加为答案。 – 2011-04-25 11:06:11
我无法将其添加为答案。 糟糕!您的答案无法提交,因为: 新用户无法回答自己的问题8小时。请使用评论,或者编辑您的问题。 – lightstep 2011-04-25 11:50:28