QSqlQuery 忽略 SQLite DB 的排序顺序
Posted
技术标签:
【中文标题】QSqlQuery 忽略 SQLite DB 的排序顺序【英文标题】:QSqlQuery ignoring sort order for SQLite DB 【发布时间】:2014-11-16 23:04:13 【问题描述】:我的QSqlQuery
返回的结果总是相同的顺序,不管ORDER BY
状态如何:
void Sy_loggingModel::reload()
auto query = d_->buildQuery();
query.setForwardOnly( true );
if ( !query.exec() )
throw Sy_exception( QObject::tr( "Failed to query logging data: " ) +
query.lastError().text() );
beginResetModel();
qDebug() << query.lastQuery()
<< d_->filter_ // First ? param
<< d_->sortedColumn_; // Second ? param
d_->entries_.clear();
while ( query.next() )
auto timestamp = query.value( 1 ).toLongLong();
auto level = query.value( 2 ).toInt();
d_->entries_ << Sy_loggingModel_d::Entry
query.value( 0 ).toLongLong(),
QDateTime::fromMSecsSinceEpoch( timestamp ).toString(),
static_cast< Sy_loggerInterface::DebugLevel >( level ),
query.value( 3 ).toString() ;
qDebug() << "\t" << query.value( 0 ).toLongLong()
<< timestamp
<< level
<< query.value( 3 ).toString();
endResetModel();
在排序顺序交替时产生此输出:
"SELECT rowid, timestamp, debugLevel, message FROM Sy_logger WHERE rowid >= ? AND debugLevel IN ( 0, 1, 2 ) ORDER BY ? DESC;" 0 1
1 1415399097350 0 "Opened database ./logs/Syren2.log"
2 1415399097382 1 "Listening on port 23000"
3 1415399418377 2 "New log rotation settings received, Metric: 0, Interval: 720"
4 1416178611851 2 "Opened database ./logs/Syren2.log"
5 1416178611852 2 "Listening on port 23000"
6 1416178612776 2 "New log rotation settings received, Metric: 0, Interval: 720"
"SELECT rowid, timestamp, debugLevel, message FROM Sy_logger WHERE rowid >= ? AND debugLevel IN ( 0, 1, 2 ) ORDER BY ? ASC;" 0 1
1 1415399097350 0 "Opened database ./logs/Syren2.log"
2 1415399097382 1 "Listening on port 23000"
3 1415399418377 2 "New log rotation settings received, Metric: 0, Interval: 720"
4 1416178611851 2 "Opened database ./logs/Syren2.log"
5 1416178611852 2 "Listening on port 23000"
6 1416178612776 2 "New log rotation settings received, Metric: 0, Interval: 720"
从命令行使用时,SQL 语句返回预期的结果集。有什么建议么?我正在使用 Qt v5.3.2。
【问题讨论】:
看起来您正在使用准备好的查询,但您的示例代码不包含构建查询的部分。 @MrEricSir 你说得对,我觉得没有必要显示代码,因为我给出了QSqlQuery::lastQuery()
返回的输出 - 这是重要的一点。
【参考方案1】:
documentation 说:
如果 ORDER BY 表达式是一个常量整数 K,则该表达式被视为结果集第 K 列的别名。
但是,参数不被视为常量,因此您用于此参数的值被用作恰好对所有行都相同的表达式。
如果要按不同的列排序,则必须动态构造SQL语句。
【讨论】:
就是这样!谢谢。以上是关于QSqlQuery 忽略 SQLite DB 的排序顺序的主要内容,如果未能解决你的问题,请参考以下文章
不要通过 QSqlQuery 获得所有 sqlite pragma 的结果
QSqlQuery 与列名 Sqlite 的 prepare 和 bindValue