首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtSql: QSqlRecord没有保留表前缀

QtSql: QSqlRecord没有保留表前缀
EN

Stack Overflow用户
提问于 2010-07-29 17:30:09
回答 2查看 736关注 0票数 4

我正在处理Qt中的一个小应用程序,我使用SQL库和SQLite作为数据库。到目前为止,这已经取得了良好的效果。QSqlQuery类仅提供通过索引而不是字段名获取列值的方法。但是,使用record()函数,查询中的当前行可以转换为一个QSqlRecord,它具有按字段名获取值的value()函数。

因此,这样做很好,并且允许我编写更短、更简洁的代码,但是像下面这样的联接查询会带来问题:

代码语言:javascript
复制
SELECT t1.*, t2.* FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id

因此,我们正常地执行此查询,并将一行转换为记录。但是事实证明,QSqlRecord中的列名没有以表名作为前缀--例如,在record对象中有两个名为id的列。这显然有点问题。

解决这个问题的最好办法是什么?

(我在Qt bug跟踪器中找到了本期,但没有多大帮助。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-29 18:11:44

字段名完全取决于驱动程序;因此,问题在于SQLite本身,它最终可能做的是‘正确’的事情(就像我没有检查过的SQL标准中的一样)。

无论如何,简单的解决方案:只是在SQL本身中给您的字段一个别名,但是您不能也不应该使用select * from

代码语言:javascript
复制
SELECT t1.id TI_ID, t1.name TI_NAME, t2.id T2_ID FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id
票数 6
EN

Stack Overflow用户

发布于 2012-01-31 21:45:03

我也发现了这个问题,但是发现如果使用QSqlQueryModel来创建QSqlRecord,它可以正常工作:

代码语言:javascript
复制
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT t1.id TI_ID, t1.name TI_NAME, t2.id T2_ID FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id");

int TI_ID          = model->record(0).value("TI_ID").toInt();
int TI_ID          = model->record(0).value(0).toInt();
QString TI_NAME        = model->record(0).value("TI_NAME").toString();
QString TI_NAME_from_id= model->record(0).value(1).toString();

您应该使用这两种样式为id和name获取相同的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3365376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档