代码之家  ›  专栏  ›  技术社区  ›  Veeti

QtSql:QSqlRecord不保留表前缀

  •  4
  • Veeti  · 技术社区  · 14 年前

    我正在Qt中开发一个小应用程序,并将SQL库与SQLite一起用作数据库。到目前为止,这一切都很顺利。这个 QSqlQuery 类仅提供通过 指数 字段名称 . 但是,使用 record() 函数可以将查询中的当前行转换为 QSqlRecord ,具有 value() 用于按字段名获取值的函数。

    因此,这很好地解决了问题,并允许我编写更简短、更清晰的代码,但是像下面这样的连接查询会带来问题:

    SELECT t1.*, t2.* FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id
    

    QSQL记录 不以表名作为前缀-例如,有两列称为 id

    (我发现 this issue 在Qt bug跟踪器中,但没有太大帮助。)

    2 回复  |  直到 14 年前
        1
  •  6
  •   Gianni    14 年前

    字段名完全依赖于驱动程序;所以问题实际上是SQLite本身的问题,毕竟它可能做的是“正确的”事情(正确的,就像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
    
        2
  •  1
  •   gollumullog    13 年前

    我也发现了这个问题,但发现如果您使用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();