9
QSqlQuery query;
QString queryText("SELECT * FROM section");
query.exec(queryText);
qDebug() << query.size(); //always -1
while (query.next()) qDebug() << query.value(0).toString(); //got 16 records

メソッドsize()は常に -1 を返します。助けてください。ありがとう。

4

3 に答える 3

14

query.size()SQLite ではサポートされていません。ただし、回避策を使用して行数を取得できます。QSqlQuery::last ()可能な場合、結果の最後のレコードを取得し、取得したレコードにクエリを配置します。呼び出した後、最後のレコードのインデックスを取得し、 andlast()を使用して最初のレコードの前にクエリを配置できます。first()previous()

int numberOfRows = 0;
if(qry.last())
{
    numberOfRows =  qry.at() + 1;
    qry.first();
    qry.previous(); 
}
于 2014-10-22T05:26:15.653 に答える
4

ドキュメントから:

結果のサイズ (返される行数) を返します。サイズを特定できない場合、またはデータベースがクエリ サイズに関する情報のレポートをサポートしていない場合は -1 を返します。非 SELECT ステートメント (isSelect() が false を返す) の場合、size() は -1 を返すことに注意してください。クエリがアクティブでない場合 (isActive() が false を返す)、-1 が返されます。

非 SELECT ステートメントによって影響を受ける行数を確認するには、numRowsAffected() を使用します。

http://qt-project.org/doc/qt-4.8/qsqlquery.html#size

クエリisSelectはアクティブですが、SQLite は、クエリのサイズが直接利用できないデータベースの 1 つです。

これを証明するには、たとえば次のように呼び出します。

qDebug() <<db.driver()->hasFeature(QSqlDriver::QuerySize);

戻るfalse

于 2014-10-21T19:49:49.213 に答える
2

私自身のために、私はこの機能を使用します

int sqlSize(QSqlQuery query)
{
    int initialPos = query.at();
    // Very strange but for no records .at() returns -2
    int pos = 0;
    if (query.last())
        pos = query.at() + 1;
    else
        pos = 0;
    // Important to restore initial pos
    query.seek(initialPos);
    return pos;
}
于 2016-09-13T11:38:59.823 に答える