• 204阅读
  • 5回复

[提问]【SQL输出】如何输出执行的SQL语句 [复制链接]

上一主题 下一主题
离线tanyue.esec
 

只看楼主 倒序阅读 楼主  发表于: 05-05
使用SqlQuery的查询语句,参数用占位符的方式进行替代,比如

SELECT * FROM sys_user WHERE ACCOUNT = :ACCOUNT


问题就在于,替代占位符之后的完整SQL语句拿不到,计划是将这个SQL操作记录下日志,方便在两个库之间做离线的数据同步。
不知道有没有办法能拿到替换占位符之后的SQL,或者干脆有更好的离线数据库同步的解决方式。
离线angelus

只看该作者 1楼 发表于: 05-06
可以看下这个函数,但它设计初衷是为了调试

QString QSqlQuery::executedQuery() const
离线liudianwu

只看该作者 2楼 发表于: 05-07
楼上正解
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线tanyue.esec

只看该作者 3楼 发表于: 05-07
回 angelus 的帖子
angelus:可以看下这个函数,但它设计初衷是为了调试
QString QSqlQuery::executedQuery() const
 (2024-05-06 09:24) 

试了一下,还是一样的效果,拿不到那个最终代入占位符参数的那个SQL

难道是因为用的是ODBC的原因?
离线angelus

只看该作者 4楼 发表于: 05-10
回 tanyue.esec 的帖子
tanyue.esec:试了一下,还是一样的效果,拿不到那个最终代入占位符参数的那个SQL
难道是因为用的是ODBC的原因? (2024-05-07 09:40) 

看来这个函数和它的说明不匹配,你可以尝试牺牲一点性能来完成这个功能
QString getLastExecutedQuery(const QSqlQuery& query)
{
    QString sql = query.lastQuery();
    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;
}
离线tanyue.esec

只看该作者 5楼 发表于: 05-16
回 angelus 的帖子
angelus:看来这个函数和它的说明不匹配,你可以尝试牺牲一点性能来完成这个功能
QString getLastExecutedQuery(const QSqlQuery& query)
{
    QString sql = query.lastQuery();
....... (2024-05-10 10:06) 

完美啊
快速回复
限100 字节
 
上一个 下一个