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
相关产品推荐
相关产品推荐

