具有多个 WHERE 过滤器的 QtSql Dynamic Select 查询
QtSql Dynamic Select query with multiple WHERE filters
- 我需要使用相同的方法执行任何 select 查询。
- 所以,我的查询必须使用一个值或 selected 数据过滤
更多
- 过滤器存储在以列名作为键的映射中,并且
过滤值作为其值。
- 所以我的问题是:如何将过滤器动态添加到 Select 语句中?
我试过的:
1. QSqlQueryModel Class:
我可以创建一个 QSqlQueryModel 对象并将查询设置为
检索整个 table 数据,但是,我
在此 class 中找不到任何功能来过滤此数据:
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT * FROM employee");
2。 QSqlTableModel:这个class是用来查看table数据在一个qtableView,我可以用这个class 读取 table 数据,然后像这样过滤这些数据(我还没有尝试过):
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 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;
}
有几种方法可以做到这一点。
将 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
}
// ...
}
使用带有 QMap
的 for 循环。
但这就是 Qt,所以为什么不利用 QMap
, QStringList
, and 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定义的宏。参见 the foreach keyword。
对于您可能想要了解的其他 QTL 类型,请参阅 containers。
QSqlQueryModel???
从你的问题和评论中我无法判断你是否真的在后台使用了 sql table model/view/widget 或者你是否完全使用了其他东西。
I thought about using loop for this matter.But, I thought that there is a better way using some qt classes like : QSqlQueryModel
当然,只是浏览文档,QSqlQueryModel
没有过滤器功能。
但是...QSqlTableModel
有没有这个功能。好的一面是,如果你已经有一个 QSqlQueryModel
坐在某处,你可以将它升级到 QSqlTableModel
因为后者继承了前者。但是还是那句话,我没有足够的信息来做出判断,所以我只是在黑暗中带领你。
希望这个答案能对您的困境有所启发,并提醒您如何提出更好的问题以获得更准确的答复。
- 我需要使用相同的方法执行任何 select 查询。
- 所以,我的查询必须使用一个值或 selected 数据过滤 更多
- 过滤器存储在以列名作为键的映射中,并且 过滤值作为其值。
- 所以我的问题是:如何将过滤器动态添加到 Select 语句中?
我试过的:
1. QSqlQueryModel Class: 我可以创建一个 QSqlQueryModel 对象并将查询设置为 检索整个 table 数据,但是,我 在此 class 中找不到任何功能来过滤此数据:
QSqlQueryModel *model = new QSqlQueryModel; model->setQuery("SELECT * FROM employee");
2。 QSqlTableModel:这个class是用来查看table数据在一个qtableView,我可以用这个class 读取 table 数据,然后像这样过滤这些数据(我还没有尝试过):
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 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;
}
有几种方法可以做到这一点。
将 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
}
// ...
}
使用带有 QMap
的 for 循环。
但这就是 Qt,所以为什么不利用 QMap
, QStringList
, and 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定义的宏。参见 the foreach keyword。
对于您可能想要了解的其他 QTL 类型,请参阅 containers。
QSqlQueryModel???
从你的问题和评论中我无法判断你是否真的在后台使用了 sql table model/view/widget 或者你是否完全使用了其他东西。
I thought about using loop for this matter.But, I thought that there is a better way using some qt classes like : QSqlQueryModel
当然,只是浏览文档,QSqlQueryModel
没有过滤器功能。
但是...QSqlTableModel
有没有这个功能。好的一面是,如果你已经有一个 QSqlQueryModel
坐在某处,你可以将它升级到 QSqlTableModel
因为后者继承了前者。但是还是那句话,我没有足够的信息来做出判断,所以我只是在黑暗中带领你。
希望这个答案能对您的困境有所启发,并提醒您如何提出更好的问题以获得更准确的答复。