Экспорт QTableView в.csv. Количество извлекаемых строк ограничено только 256

Я написал программу с графическим интерфейсом, которая будет подключаться к oracle db для получения данных после ввода запроса. полученные данные отображаются в виджете модели таблицы QTableView. и позже результат QTableView экспортируется в файл.csv

QString MyQuery = ui->lineQuery->text();
db.open();
QSqlQuery query(MyQuery,db);

if(query.exec())
{
    qDebug()<<QDateTime::currentDateTime()<<"QUERY SUCCESS ";
    ui->queryButton->setStyleSheet("QPushButton {background-color: rgb(0, 255, 0);}");

    this->model=new QSqlQueryModel();
    model->setQuery(MyQuery);
    ui->tableViewOra->setModel(model);

    QString textData;
    int rows=model->rowCount();
    int columns=model->columnCount();

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            textData += model->data(model->index(i,j)).toString();
            textData += ", ";      // for .csv file format
        }
        textData += "\n";             // (optional: for new line segmentation)
    }

    QFile csvfile("/home/aj/ora_exported.csv");
    if(csvfile.open(QIODevice::WriteOnly|QIODevice::Truncate))
    {
        QTextStream out(&csvfile);
        out<<textData;
    }
    csvfile.close();
}

Теперь проблема в том, что во время запроса, который я наблюдал, в QTableView видны 543 строки (что является правильным, потому что есть 543 записи). Но когда экспортируется файл.csv, там только 256 строк.

Есть ли какое-то ограничение по размеру, о котором я не знаю???

О каких переменных следует позаботиться, если я хочу экспортировать файлы.csv размером до 1000 строк? Благодарю.

1 ответ

Решение

Я думаю, когда вы впервые читаете model->rowCount() модель не принесла все результаты полностью. Хотя он будет загружен позже при отображении табличного представления, что приведет к полному отображению строк в табличном представлении.

Попробуй использовать QSqlQueryModel::fetchMore перед чтением счетчика строк:

while (model->canFetchMore())
   model->fetchMore();

int rows=model->rowCount();
int columns=model->columnCount();

[Дополнительная информация от Tay2510]:

Вы можете просто изменить флаг открытия файла

if(csvfile.open(QIODevice::WriteOnly|QIODevice::Truncate))

в

if(csvfile.open(QIODevice::WriteOnly))

Первый будет перезаписывать тот же файл, в то время как последний добавляет к нему данные.

Другие вопросы по тегам