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及之前的版本中,数据库名.表名.列名这些标识符默认是区分大小写的:在之后的版本中默认不区分大小 ...
随机推荐
- Shell Step by Step (3) —— Stdin & if
4.输入输出 #! /bin/bash # Read users input and then get his name read -p "Please input your first n ...
- 从贝叶斯模型(Bayes)到生成模型(Generative models)(生成式分类器,generative classifier)
0. 基于贝叶斯公式的生成式分类器 生成式分类器(generative classifier)即是已知类别得样本: p(y=c|x,θ)∝p(x|y=c,θ)p(y=c|θ) p(x|y=c,θ) 称 ...
- Swift 中使用 SwiftyJSON 制作一个比特币价格 APP
Swift 中处理 JSON 数据有很多种方式,可以使用原生的 NSJSONSerialization,也可以使用很多第三方库.原生的 NSJSONSerialization 方式这篇文章中介绍过.这 ...
- 从Windows系统服务获取活动用户的注册表信息(当前活动用户的sessionId. 当前活动用户的 hUserToken)
首先,对“活动用户”的定义是,当前拥有桌面的用户.对于Windows XP及其以后的系统,即使是可以多个用户同时登录了,拥有桌面的也仅仅只有一个. 如果系统级服务调用Windows API来获取注册表 ...
- jquery hover()的使用
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 图像滤镜艺术---挤压(Pinch)滤镜
原文:图像滤镜艺术---挤压(Pinch)滤镜 Pinch滤镜 Pinch滤镜是通过坐标变换来实现以某个点(cenX,cenY)为中心,某个半径R内图像向其挤压变形的效果.实现这个滤镜的算法很多,主要 ...
- Win10《芒果TV》更新v3.4.10春光版:优化弹窗体验,修复热键和推送
春来触地故乡情,忽见风光忆两京,金谷踏花香骑入,曲江碾草钿车行,Win10版<芒果TV>更新v3.4.10,进一步优化弹窗体验,修复热键和推送异常. Win10版<芒果TV>V ...
- 【Windows10 IoT开发系列】Powershell命令行实用程序
原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Admin ...
- SqlServer判断数据库、表、字段、存储过程、函数是否存在
原文:SqlServer判断数据库.表.字段.存储过程.函数是否存在 判断数据库是否存在 if exists (select * from sys.databases where name = '数据 ...
- 如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序。
原文 如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序. 本文的内容 已安装与配置的应用程序 删除配置的应用程序 安装与配置的应用程序^ 在介绍如何删除所 ...