C++ QtSql:QSqlRecord不保留表前缀

C++ QtSql:QSqlRecord不保留表前缀,c++,qt,C++,Qt,我正在使用Qt开发一个小应用程序,并将SQL库与SQLite一起用作数据库。到目前为止,这一切进展顺利。QSqlQuery类只提供了一种通过索引而不是字段名获取列值的方法。但是,使用record函数可以将查询中的当前行转换为QSqlRecord,它具有value函数,用于按字段名获取值 因此,这很好,允许我编写更短、更清晰的代码,但是像下面这样的连接查询会带来问题: SELECT t1.*, t2.* FROM table1 AS t1, table2 AS t2 WHERE t1.table2

我正在使用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跟踪器中找到了它,但没有多大帮助。

字段名完全取决于驱动程序;所以问题实际上是SQLite本身,它可能做了“正确”的事情,毕竟是正确的,就像SQL标准一样,我没有检查过

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


我也发现了这个问题,但发现如果使用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值。

值得一提的是,Qt-MySQL驱动程序也有这种行为。我在使用带别名的subselect和case语句时遇到了类似的问题,因此我的工作是由Sqllite完成的。不幸的是,当弹出到SqlRecord时,只有1个字段集,所以我甚至不能通过id或字段名以任何方式访问我的数据。有人有办法吗?
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();