c++ - 具有多个 WHERE 过滤器的 QtSql 动态选择查询
问题描述
- 我需要使用相同的方法执行任何选择查询。
- 因此,我的查询必须使用一个或多个值过滤所选数据。
- 过滤器存储在以列名作为键 、过滤值作为其值的映射中。
- 所以我的问题是:如何将过滤器动态添加到 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.for循环我想过用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;
}
解决方案
有几种方法可以做到这一点。
使用 for 循环和std::map
.
使用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
}
// ...
}
使用 for 循环和QMap
.
但这就是 Qt,所以为什么不利用QMap
,QStringList
和QString
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 定义的宏。请参阅foreach 关键字。
对于您可能想要了解的其他 QTL 类型,请参阅容器。
QSqlQueryModel???
我无法从您的问题和评论中判断您是否真的在后台有一个 sql 表模型/视图/小部件,或者您是否完全使用了其他东西。
我考虑过使用循环来解决这个问题。但是,我认为使用一些 qt 类有更好的方法,例如:QSqlQueryModel
当然,只是浏览文档,QSqlQueryModel
没有过滤功能。
但是……确实有这个功能。有利的一面是,如果您已经在某个地方坐着,您可以将其升级为 a,因为后者继承了前者。但同样,我没有足够的信息来做出判断,所以我只是在这里在黑暗中引导你。QSqlTableModel
QSqlQueryModel
QSqlTableModel
希望这个答案能对您的困境有所启发,同时提醒您如何提出更好的问题以获得更准确的回答。
推荐阅读
- c - 在 c 中将图像旋转 x 角度
- java - 从表格制作图形人口地图
- python - python / windows - 无法安装 lasio python 包 - RequirementParseError
- ruby-on-rails - Custom create action in ActiveAdmin
- asp.net - 在 TemplateField 中创建的按钮的 onClick 函数中访问单元格内容
- python - 什么决定了这个 python 3 代码中集合元素的顺序?
- java - 为什么这个数组循环?
- javascript - 使用 JavaScript/JQuery 过滤 HTTP 请求
- quantlib - QuantLib (Python) ZeroCouponBond。适当的收益率曲线
- java - JavaFX - 通过按钮编辑树视图节点文本