我正在处理Qt中的一个小应用程序,我使用SQL库和SQLite作为数据库。到目前为止,这已经取得了良好的效果。QSqlQuery类仅提供通过索引而不是字段名获取列值的方法。但是,使用record()函数,查询中的当前行可以转换为一个QSqlRecord,它具有按字段名获取值的value()函数。
因此,这样做很好,并且允许我编写更短、更简洁的代码,但是像下面这样的联接查询会带来问题:
SELECT t1.*, t2.* FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id因此,我们正常地执行此查询,并将一行转换为记录。但是事实证明,QSqlRecord中的列名没有以表名作为前缀--例如,在record对象中有两个名为id的列。这显然有点问题。
解决这个问题的最好办法是什么?
(我在Qt bug跟踪器中找到了本期,但没有多大帮助。)
发布于 2010-07-29 18:11:44
字段名完全取决于驱动程序;因此,问题在于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发布于 2012-01-31 21:45:03
我也发现了这个问题,但是发现如果使用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获取相同的值。
https://stackoverflow.com/questions/3365376
复制相似问题