为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:达梦8
【操作系统】:win10
【CPU】:x86
【问题描述】*:
QDM对当前行的某一列的数据只能读取一次,再次读取时不能正确读取
使用qt自带的querymodel示例测试代码如下:
// 连接数据库
QSqlDatabase db = QSqlDatabase::addDatabase(“QDM”);
db.setHostName(“192.168.1.100”);
db.setPort(5236);
db.setUserName(“SYSDBA”);
db.setPassword(“SYSDBA”);
// 创建表并插入数据
QSqlQuery query;
query.exec(“create table person (id int primary key, firstname varchar(20), lastname varchar(20))”);
query.exec(“insert into person values(101, ‘Danny’, ‘Young’)”);
query.exec(“insert into person values(102, ‘Christine’, ‘Holand’)”);
query.exec(“insert into person values(103, ‘Lars’, ‘Gordon’)”);
query.exec(“insert into person values(104, ‘Roberto’, ‘Robitaille’)”);
query.exec(“insert into person values(105, ‘Maria’, ‘Papadopoulos’)”);
// 查询
QSqlQuery q(“select id from person”);
q.next();//获取一行数据
int i = q.value(0).toInt(); // 第1次读取第1列,正常,返回101
int ii = q.value(0).toInt();// 第2次读取第1列,不能正常获取,返回0
跟踪QDM代码qsql_dm.cpp发现问题所在
r = dpi_get_data(hStmt,
column+1,
isSigned ? DSQL_C_SLONG : DSQL_C_ULONG,
(dpointer)&intbuf,
sizeof(intbuf),
&lengthIndicator);
if (r != DSQL_SUCCESS && r != DSQL_SUCCESS_WITH_INFO)
return QVariant(QVariant::Invalid);
dpi_get_data在第二此读取时返回值r为DSQL_NO_DATA
因为游标采用绝对行号进行fetch所以内容只有一行,故第二次get_data读取无数据,如果确定要使用绝对行号进行返回则需要在第二次读取前按递增行号再次进行fecth
或者可以选择使用循环嵌套相对行号处理
[dmdba@db demo]$ ./test
connect to server success!
0
1
2
3
4
老师,换成达梦自带的驱动试试