You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QML传入Oracle绑定值时32位编译下出现ORA-01480缺失尾随空值问题

32位编译下Qt-Oracle字符串绑定偶发ORA-01480错误问题

问题概述

在VS2019 + Qt5.15.1的32位编译环境中,QML通过Q_INVOKABLE宏调用Qt类方法传递字符串,作为Oracle UPDATE语句的绑定变量时,偶发ORA-01480 trailing null missing from STR bind value错误,部分场景下exec()无报错但执行结果不符合预期。

Qt核心代码实现

Q_INVOKABLE void setFields(QVariantList fields) {m_fields = fields;}
Q_INVOKABLE void setValues(QVariantList values) {m_values = values;}
Q_INVOKABLE bool save()
{
    for(int i = 0; i < m_fields.count(); i++) {
        QSqlQuery q;
        q.prepare("UPDATE TABLE SET VALUE = :VALUE WHERE KEY = :KEY");
        q.bindValue(":KEY", m_fields.at(i));
        q.bindValue(":VALUE", m_values.at(i));
        q.exec();
    }
}

异常触发特征

  • 错误非必现,存在随机性
  • QML字符串属性传递差异:使用字面量字符串(如property string myValue: "abc")会触发错误,用qsTr("abc")包裹后无异常
  • 调试m_values.at(i).toString()得到的QString表面无异常,但直接拷贝QString tmp = m_values.at(i).toString()无法解决问题

临时有效解决方法

通过逐字符拷贝生成新QString后再绑定变量,可消除错误:

QString tmp;
for(int j = 0; j < m_values.at(i).toString().size();j++)
    tmp += m_values.at(i).toString().at(j);
// ...
q.bindValue(":VALUE", tmp);

内容的提问来源于stack exchange,提问作者Fabio Paolini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:24:55