Экспорт 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))
Первый будет перезаписывать тот же файл, в то время как последний добавляет к нему данные.