具有多个WHERE过滤器的QtSql动态选择查询

时间:2018-11-18 00:04:51

标签: c++ sql qt where qtsql

  • 我需要使用相同的方法执行任何选择查询。
  • 因此,查询my必须使用一个值或 更多
  • 过滤器存储在以列名作为的地图中, 过滤值作为其
  • 所以我的问题是:如何将过滤器动态添加到Select语句中?
  • 我尝试过的操作

    1。 QSqlQueryModel类:         我可以创建一个 QSqlQueryModel 对象,并将查询设置为         检索整个表数据,但是,我         在此类中找不到任何功能来过滤此数据:

       QSqlQueryModel *model = new QSqlQueryModel;
       model->setQuery("SELECT * FROM employee");
    

    2。 QSqlTableModel:该类用于在 qtableView 中查看表数据,我可以使用该类读取表数据,然后像这样过滤该数据(我还没有尝试过):

     QSqlTableModel *model = new QSqlTableModel
     model->setTable("employee");
     model->setEditStrategy(QSqlTableModel::OnManualSubmit);
     model->select();
     model->setFilter("colum5 > 10");
     // I can use after that data() method to retrieve filtered data. 
    

    3。对于Loop ,我曾考虑过使用for循环直接添加过滤器,但是,我宁愿选择一种更好的方法,因为我相信QT会提供此类服务。


方法应如下所示:

/**
 * @brief getData executes sql select query.
 * @param query [out] QSqlQuery query object after executing the query.
 * @param queryFilters [in] map of query filters (column-name, filter- 
   value).
 * @param table [in] table name.
 * @return 
 */
bool getData(QSqlQuery &query, std::map<std::string,QVariant> &queryFilters, 
std::string &table){
        bool status = false;
        std::string queryText = "SELECT * from " + table + " WHERE  ";
        // I should apply filters from queryFilters map here.
        return status;
} 

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式进行此操作。

std::map中使用for循环。

使用 for 循环遍历密钥对值。

bool getData(QSqlQuery &query, const std::map<std::string,QVariant> &queryFilters,
             std::string &table)
{
    // ...

    std::string queryText = "SELECT * from " + table + " WHERE";

    for (auto it = queryFilters.begin(); it != queryFilters.end(); )
    {
        queryText += " " + it->first + "='" + it->second.toString().toStdString() + "'";

        it++;
        // check the iterator isn't the last iterator
        if (it != queryFilters.end())
            queryText += " AND";    // separate your "filters" using an AND
    }

    // ...      
}

QMap中使用for循环。

但是,这就是Qt,所以为什么不利用original documentationQMapQStringList QTL类型。

bool getData(QSqlQuery &query, const QMap<QString, QVariant> &queryFilters,
             const QString &table)
{
    //  ...

    QString queryText = "SELECT * from " + table + " WHERE ";
    QStringList filters;
    foreach (const QString &filterKey, queryFilters.keys())
        filters << filterKey + "='" + queryFilters.value(filterKey).toString() + "'";

    queryText += filters.join(" AND ");

    //  ...

}

请注意,foreach是Qt定义的宏。参见QString

有关您可能需要了解的其他QTL类型,请参见the foreach keyword


QSqlQueryModel ???

我无法从您的问题和评论中得知您是否实际上在后台有一个sql表模型/视图/小部件,或者您是否正在完全使用其他功能。

  

我曾考虑过使用循环,但是,我认为使用某些qt类(例如QSqlQueryModel

)有更好的方法

可以肯定的是,containers仅浏览文档,没有过滤功能。

但是 ... QSqlQueryModel 确实具有此功能。好的一面是,如果某个地方已经有QSqlQueryModel,则可以将其升级为QSqlTableModel,因为后者继承了前者。但是,我又没有足够的信息来做出判断,所以我只是在黑暗中带领您走来走去。

希望这个答案可以帮助您了解困境,并提醒您如何提出更好的问题以获得更准确的答案。