我正在使用Qt中的一个小应用程序,我正在使用SQL库和SQLite作为数据库。到目前为止,这已经很好了。 QSqlQuery
类仅提供了一种通过索引而非字段名称获取列值的方法。但是,使用record()
函数,查询中的当前行可以转换为QSqlRecord
,其value()
函数可以按字段名称获取值。
所以,这很好用,可以让我编写更简洁,更清晰的代码,但是像下面这样的连接查询会带来问题:
SELECT t1.*, t2.* FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id
因此我们正常执行此查询,并将行转换为记录。但事实证明QSqlRecord
中的列名不以表名为前缀 - 例如,在记录对象中有两列名为id
的列。这显然有点问题。
这个问题的最佳解决方案是什么?
(我在Qt bug跟踪器中找到了this issue,但它没有多大帮助。)
答案 0 :(得分:6)
字段名称完全取决于驱动程序;所以这个问题确实存在于SQLite本身,毕竟它可能正在做“正确”的事情(正确的,就像在SQL标准中一样,我没有检查过)。
无论如何,简单的解决方案:只是在SQL本身中为您的字段添加别名,但是,您不能,也不应该使用select * from
:
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
答案 1 :(得分:1)
我也发现了这个问题,但发现如果你使用QSqlQueryModel创建你的QSqlRecord就可以了:
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的相同值。