更好的功能(受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