QSqlTableModel problem z select()

0

Witam,

mam bardzo dziwny problem z zachowaniem QSqlTableModel::select()
Kod:

void QSqlMyTableModel::set_entries()
{
   this->select();
   qDebug() << this->tableName() << lastError();
   qDebug() << "query: " << this->query().isActive();
   qDebug() << "select -> rows: " << rowCount();
   //qDebug() << "select statement: " << selectStatement();

    QSqlQuery q;
    q.exec("SELECT COUNT(*) FROM "+ tableName());
    q.next();
    qDebug() << tableName() << " has: " << q.value(0) << " records";

    _entries.reserve(this->rowCount());
    for(int i = 0; i < this->rowCount(); ++i)
        _entries.push_back(this->record(i));
}

Konsola:

"fv_list" QSqlError("", "", "")
query: true
select -> rows: 256
"fv_list" has: QVariant(qlonglong, 1971) records

na małej ilości rekordów wszystko działało
dodam jeszcze, że wykonywanie zapytania zwróconego przez QSqlTableModel::selectStatement() w samej bazie SQL daje prawidłowe wyniki
ma ktoś jakiś pomysł ?

2

Po kiego grzyba dziedziczenie po QSqlTableModel? To jest tradycyjny przykład jak się nie robi OOP (na dodatek nazwa tej klasy).

Jaki jest problem? Domyślam się, że różna wielość kolumn (256/1971).
Gdzie są te query?
Jak skonfigurowałeś QSqlTableModel.

Zresztą podany fragment kodu wygląda jak posklejane śmieci. Co to ma robić?

0

Dzięki za odpowiedź, ale przede wszystkim Marku: wyluzuj. Nie jestem programistą i nie zamierzam nim zostać. Na co dzień zajmuję się zupełnie czymś innym.

Jak skonfigurowałeś QSqlTableModel.

w pewnym stopniu zgodnie z tym co znalazłem na stronie qt.io dla QSqlRelationalTableModel
jeśli ma to jakieś znaczenie...:

using sqlRecContainer = std::vector<QSqlRecord>;

class QSqlMyTableModel : public QSqlRelationalTableModel
{
    Q_OBJECT
public:
    QSqlMyTableModel() = default;

    auto begin() const
    { return _entries.begin(); }
    auto end() const
    { return _entries.end(); }

    const sqlRecContainer &entries() const
    { return _entries; }
    QSqlRecord get_prototype_record() const;

    template <typename T>
    auto find(const T &field, const QVariant &value) const
    {
        auto rec = std::find_if(_entries.begin(), _entries.end(),
                     [&](const QSqlRecord &rec) { return rec.value(field) == value; });

        return rec != _entries.end() ?
                    std::make_optional<sqlRecContainer::const_iterator>(rec) : std::nullopt;
    }
    template <typename T>
    bool exists(const T &field, const QVariant &value) const
    {
        return find(field, value) ? true : false;
    }
    bool exists(const QSqlRecord &rec, sqlRecContainer::const_iterator hint) const;

    template <typename T>
    bool update(const T &field, const QVariant &old_value, const QVariant &new_value) const
    {
        auto it = find(field, old_value);
        if(!it)
            return false;
        (*it)->value(field) = new_value;
        this->record(std::distance(_entries.begin(), *it)).field(field).setValue(new_value);

        return true;
    }
    void setTable(const QString &tb_name) override;
    QStringList generate_qstrlist(const QString &field_name) const;

    bool push_back_record(std::vector<QVariant> &&values);
    bool push_back_record(QSqlRecord &&new_record);

    bool submit() override;

private:
    sqlRecContainer _entries;
    void set_entries();
    bool insert(QSqlRecord &&rec);
};

Zresztą podany fragment kodu wygląda jak posklejane śmieci. Co to ma robić?

To ma pokazać bug. W bazie SQL jest 1971 rekordów (wierszy). this->select() z jakiegoś powodu zwraca ich tylko pierwsze 256. Dodałem QSqlQuery i okazuje się, że q.exec("SELECT COUNT(*) FROM "+ tableName()); zwraca prawidłowe 1971
Więc pytanie: skąd te 256 ? W konsoli widać, że select() nie powoduje błędu (lastError() jest pusty).

Domyślam się, że różna wielość kolumn (256/1971).

... ? jakich kolumn ?
to jedna i ta sama tabela SQL, nie ma różnic w wielkości i typie kolumn

2
Mc_Hammer napisał(a):

Więc pytanie: skąd te 256 ? W konsoli widać, że select() nie powoduje błędu (lastError() jest pusty).

QSqlTableModel zazwyczaj używany jest w parze z QTableView, więc 256 to limit, żeby nie pobierać bezsensu tysiąca rekordów, bo i tak naraz ich wszystkich nie wyświetlisz.

Zobacz co zwraca metoda canFetchMore().

1 użytkowników online, w tym zalogowanych: 0, gości: 1