簡體   English   中英

SQLite + Qt:從表中選擇總是返回單行

[英]SQLite+Qt: Select from table always returns single row

我使用以下代碼使用Qt從SQLite DB中獲取數據:

QSqlQuery wordQuery( QString( "SELECT id, word FROM Words WHERE ref_id = :ref_id" ) );
wordQuery.bindValue( ":ref_id", refId );
wordQuery.setForwardOnly( true );
wordQuery.exec( );

while( wordQuery.next( ) ) {
    // obtain data from `wordQuery` using QSqlQuery::value( )
}

Words表確實包含ref_id字段等於所需值的行。 我已經使用Qt演示應用程序提供的sqlbrowser進行了檢查。 但是QSqlQuery::next( )僅在第一次時返回true,而我無法獲取其余行。

順便說一句,在這里我發現了類似的問題,但對我而言,向后迭代不起作用

下面,我把整個功能代碼:

QList<Word> LyricsMasterModel::fetchWords( const DbId &refId )
{
QList<Word> result;

if ( !db.isOpen( ) && !db.open( ) ) {
    return result;
}

QSqlQuery wordQuery;
wordQuery.setForwardOnly( true );
wordQuery.prepare( QString( "SELECT id, word FROM %1 WHERE ref_id = :ref_id" )
    .arg( WORDS_TABLE_NAME ) );
wordQuery.bindValue( ":ref_id", refId );
if ( !wordQuery.exec( ) ) {
    qDebug( ) << "SQL QUERY ERROR:" << wordQuery.lastError( ).text( );
}

const QSqlRecord wordTuple = wordQuery.record( );
const int idIndex = wordTuple.indexOf( "id" );
Q_ASSERT( -1 != idIndex );
const int wordIndex = wordTuple.indexOf( "word" );
Q_ASSERT( -1 != wordIndex );

while (wordQuery.next()) {
    Word word;

    word.setId( wordQuery.value( idIndex ).toByteArray( ) );
    word.setSongId( refId );
    word.setWord( wordQuery.value( wordIndex ).toString( ) );

    result << word;
}

db.close( );
return result;
}

解決方案:我沒有找到問題的原因,但是以下變體似乎是可行的:

QSqlQuery wordQuery;
wordQuery.prepare( QString( "SELECT id, word FROM %1 WHERE ref_id = :ref_id" )
    .arg( WORDS_TABLE_NAME ) );
wordQuery.bindValue( ":ref_id", refId );
const bool res = wordQuery.exec( );
Q_ASSERT( res );

if ( wordQuery.last( ) ) {
    do {
        // do stuff
    } while (wordQuery.previous());
}

您的代碼有一個主要的綁定問題,即:

QSqlQuery :: QSqlQuery(const QString&query = QString(),QSqlDatabase db = QSqlDatabase())

使用SQL查詢和數據庫db構造QSqlQuery對象。 如果未指定db或該數據庫無效,則使用應用程序的默認數據庫。 如果查詢不是一個空字符串,它將被執行。

因此,您的查詢將在構造期間執行,因為它不為空,並且綁定已經為時已晚。

我個人將使用空字符串作為默認實例來構造實例,然后根據文檔進行顯式准備。

所以,我會寫這樣的東西:

QSqlQuery wordQuery();
wordQuery.setForwardOnly(true);
wordQuery.prepare("SELECT id, word FROM Words WHERE ref_id = :ref_id");
wordQuery.bindValue(":ref_id", refId);
if (!wordQuery.exec())
    qDebug() << "SQL QUERY ERROR:" << wordQuery.lastError().text();

while (wordQuery.next()) {
    // obtain data from `wordQuery` using QSqlQuery::value( )
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM