2014-11-16 3 views
0

Результатов, возвращаемых моего QSqlQuery всегда в том же порядке, независимо от ORDER BY состояния:QSqlQuery игнорируя порядок сортировки для SQLite DB

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.

+0

Похоже, что вы используете подготовленный запрос, но ваш примерный код не включает ту часть, где построен запрос. – MrEricSir

+0

@MrEricSir Вы правы, я не чувствовал необходимости показывать код, поскольку я даю его вывод, возвращенный 'QSqlQuery :: lastQuery()' - это важный бит. – cmannett85

ответ

2

documentation говорит:

Если ORDER BY выражение является константой целое число К, то выражение считается псевдонимом для K-го столбца результирующего набора.

Однако параметры не считаются константами, поэтому значение, которое вы используете для этих параметров, используется как выражение, которое бывает одинаковым для всех строк.

Если вы хотите отсортировать по разным столбцам, вам необходимо построить инструкцию SQL динамически.

+0

Вот и все! Спасибо. – cmannett85

Смежные вопросы