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