QSqlRelationalTableModel的Select语句会改变列的名字
不解释QSqlRelationalTableModel是什么东西。看以下代码:
//3.1 创建model
model = new QSqlRelationalTableModel();
model->setTable("tyzb_xmmx");
model->setFilter(filter);
model->setSort(tyzb_xmmx::xh,Qt::AscendingOrder); //3.2 外键列显示问题
model->setRelation(tyzb_xmmx::dwdm_id,QSqlRelation("dm_dwdm","dwdm","dwmc"));
model->setRelation(tyzb_xmmx::xmlb_id,QSqlRelation("dm_xmlb","xh","lbmc"));
model->setRelation(tyzb_xmmx::zydm_id,QSqlRelation("dm_zydm","xh","zymc"));
model->setRelation(tyzb_xmmx::zjxx_id,QSqlRelation("tyzb_zjxx","xh","zjxm"));
model->setJoinMode(QSqlRelationalTableModel::LeftJoin); //外键列为空的行也要显示
..........
其余的一些代码如设置列头显示、调整QTableView等都省略,然后调用以下代码:
//4 执行查询
QSqlRecord r = model->record();
QStringList fieldNames;
for(int i = ; i< model->columnCount();i++){
fieldNames.append( r.fieldName(i));
}
qDebug() << fieldNames.join(','); model->select(); r = model->record();
fieldNames.clear();
for(int i = ; i< model->columnCount();i++){
fieldNames.append( r.fieldName(i));
}qDebug() << fieldNames.join(',');
查看下QDebug的输出:
"xh,createDate,bz,isDelete,lastOperate,bnd,jzsj,xmmc,nd,ndyq,qssj,xmbh,xmdm,xmsqs,yjnryq,yap,zszjyj,zgs,dwdm_id,xmlb_id,zjxx_id,gjz,zydm_id,zypx,hcmc"
"xh,createDate,bz,isDelete,lastOperate,bnd,jzsj,xmmc,nd,ndyq,qssj,xmbh,xmdm,xmsqs,yjnryq,yap,zszjyj,zgs,dwmc,lbmc,zjxm,gjz,zymc,zypx,hcmc"
发现什么了,外键所在列的列名已经被Select语句更新为外键显示列了,您如果在Select语句后还调用以下语句获取列序号,是会出错的,具体是返回-1:
model->fieldIndex("zydm_id"); //返回-1
作为对比,继续在执行过Select调用的model上调用:
r = model->record();
qDebug() << r.field(model->fieldIndex("zymc"));
qDebug() << r.field(model->fieldIndex("zymc")).value();
返回以下信息:
QSqlField("zymc", QString, length: , precision: , required: no, generated: yes, typeID: , autoValue: false, readOnly: false)
QVariant(QString, "集采中心")
也就是说,返回的是外键的显示值,而不是外键值本身。
那么,能否在model中直接获取原来的zydm_id值? 目前还没有发现好的办法,只有重新创建一个QSqlQuery语句,根据主键xh获取:
QSqlQuery getZydm(QString("select zydm_id from tyzb_xmmx where xh=%1").arg(r.value(tyzb_xmmx::xh).toString()));
if(getZydm.first())
qDebug() << getZydm.value();
这时返回了外键的键值: QVariant(qlonglong, 7),
很不和谐优雅的办法啊! 暂时这样吧,有没有更好的请过客指点一二!
QSqlRelationalTableModel的Select语句会改变列的名字的更多相关文章
- 【MySQL】通过select语句把一列数据拼接成一条字符串
通过 GROUP_CONCAT(如下图)
- Mysql中两个select语句的连接
Mysql中两个select语句连接需要用到操作符 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥 ...
- UNION操作用于合并两个或多个 SELECT 语句的结果集。
UNION操作用于合并两个或多个 SELECT 语句的结果集. 大理石平台价格 使用示例: $Model->field('name') ->table('think_user_0') -& ...
- 【MySQL】SELECT语句 - 查询数据
第4章 检索数据 文章目录 第4章 检索数据 1.SELECT语句 2.检索单个列 3.检索多个列 4.检索所有列 5.检索不同的行 6.限制结果 7.使用完全限定的表名 8.小结 简单记录 - My ...
- SQL-Union、Union ALL合并两个或多个 SELECT 语句的结果集
UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列 ...
- SQL Fundamentals: Basic SELECT statement基本的select语句(控制操作的现实列)(FROM-SELECT)
SQL Fundamentals || Oracle SQL语言 Capabilities of the SELECT Statement(SELECT语句的功能) Data retrieval fr ...
- 8.2.1.1 Speed of SELECT Statements 加速SELECT 语句
8.2.1 Optimizing SELECT Statements 8.2.2 Optimizing Data Change Statements 8.2.3 Optimizing Database ...
- mysql 查询select语句汇总
数据准备: 创建表: create table students( id int unsigned primary key auto_increment not null, name varchar( ...
- MySQL中SELECT语句简单使用
最近开始复习mysql,查漏补缺吧. 关于mysql 1.MySQL不区分大小写,但是在MySQL 4.1及之前的版本中,数据库名.表名.列名这些标识符默认是区分大小写的:在之后的版本中默认不区分大小 ...
随机推荐
- PDW中的Split Querying Process
最近看了关于 SQL Server 的分布式处理方面的论文,觉得它提出的 Polybase 跟之前看过的 HadoopDB 有些神似,这里做个小总结(抽空再把 HadoopDB 的总结贴出来). 不算 ...
- 字符串、对象、数组操作方法、json方法
1.字符串操作方法 1.charAt * 作用 * 通过索引找字符 ...
- jQuery插件实现的页面功能介绍引导页效果
新产品上线或是改版升级,我们会在用户第一次使用产品时建立一个使用向导,引导用户如何使用产品,如使用演示的方式逐一介绍界面上的功能模块,从而提升了用户体验和产品的亲和力. Helloweba.com之前 ...
- MapReduce 编程 系列七 MapReduce程序日志查看
首先,假设须要打印日志,不须要用log4j这些东西,直接用System.out.println就可以,这些输出到stdout的日志信息能够在jobtracker网站终于找到. 其次,假设在main函数 ...
- message contains no documents code:13066 mongdb数据库报的错误
message contains no documents code:13066stackoverflow上面的回答是: What version of the C# driver are you ...
- c语言学习笔记(6)——for和while循环
for和while等价替换 -------------------------- int i = 1; for (i; i<=100; i++){ sum = sum + 1; } ------ ...
- 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)
原文 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图) UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式.不过,总有一些特别的情况下我们需要用到不止一个窗口 ...
- 3 Task中的一些枚举 创建时候的、continue时候的
创建时常用的枚举: None.PreferFairness.LongRunning.AttacthedToParent.DenyChildAttach.HideScheduler AttacthedT ...
- BSD介绍
BSD许可证模板 * Copyright (c) 1998, Regents of the University of California * All rights reserved. * ...
- 图像滤镜艺术---PS图像转手绘特效实现方案
原文:图像滤镜艺术---PS图像转手绘特效实现方案 手绘效果实现方案 本文介绍一种PS手绘效果的实现方案,PS步骤来自网络,本文介绍代码实现过程. 整体看来,虽然效果还是有很大差异,但是已经有了这种特 ...