为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:CENTOS7.3
【CPU】:X64
【问题描述】*:程序插入insert数据时一直报数据超出范围,不知道什么原因,如下
输出信息如下:
[root@PRS7000A test]# ./test
connect ok!
QODBCResult::exec: Unable to execute statement: “数据超出范围”
insert fail! “数据超出范围 QODBC3: Unable to execute statement”
测试代码如下:
#include <QtSql>
#include <QDebug>
#include <QTextCodec>
#include <QCoreApplication>
#include <QList>
#include <QVariant>
int main(int argc, char *argv[])
{
QCoreApplication a(argc,argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("192.168.0.40");
db.setPort(5236);
db.setDatabaseName("DM");
db.setUserName("SYSDBA");
db.setPassword("prs7000.sunri");
if (db.open())
qDebug() << "connect ok!";
else
{
qDebug() << "connect fail! " << db.lastError().text().toLatin1();
}
QSqlQuery query(db);
QString strsql0=" DROP table if exists PRS7000CFG.test";
query.exec(strsql0);
//清空表,初始化测试环境
QString strsql1=" CREATE TABLE PRS7000CFG.test ( ID INT NOT NULL, Value FLOAT DEFAULT 0) STORAGE(ON MAIN, CLUSTERBTR) ";
query.exec(strsql1);
//插入数据
QString strsql = "INSERT INTO PRS7000CFG.test (id, Value) VALUES(?, ?)";
query.prepare(strsql);
QList<QVariant> lstVals;
int id = 0;
float value = 0.0f;
lstVals.push_back(QVariant(id));
lstVals.push_back(QVariant(value));
query.addBindValue(lstVals.at(0));
query.addBindValue(lstVals.at(1));
if (query.exec())
{
qDebug() << "insert ok!";
}
else
{
qDebug() << "insert fail! " << query.lastError().text();
getchar();
exit(-1);
}
return a.exec();
}
目前定位出来是QT相关库的缺陷,具体代码如下
lstVals.push_back(QVariant(value))出的问题,如果value是float类型确实插不进去,如果value是double类型,是可以插进去的;
目前最有可能的是有两个原因:
(1)QT的driver sql接口libqsqlodbc.so有问题(我的QT是4.8.7)
(2)达梦的ODBC动态库 libdodbc.so出的问题;
不是达梦数据库本身的问题,所以单纯的测试sql语句测试不出来。
已经解决,需要改驱动
您能把这条sql拿出来,放到我们manager上执行一下试试吗?