QSqlTableModel problem z select()

QSqlTableModel problem z select()
Mc_Hammer
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
0

Witam,

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

Kopiuj
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ł ?

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:7 minut
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ć?


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Mc_Hammer
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
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...:

Kopiuj
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

tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
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().


"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
Mc_Hammer
Dzięki za wyjaśnienie :) canFetchMore() zwraca true

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.