Можете ли вы получить столбец данных (MySQL) в вектор в Qt без итерации? - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть данные в базе данных MySQL, которые я хочу поместить в вектор, чтобы поработать над ними.Возможно, эта проблема относится не только к QSqlTableModels, а к любой QAbstractTableModel, но я не уверен.Прямо сейчас у меня есть

model->QSqlQueryModel::setQuery(q); //model is a QSqlTableModel, q gets 1 column of data
QVector<QVariant> var;
var.reserve(num_rows);
QVariant datum;
QModelIndex idx;
for (i=0; i<num_rows; ++i)
{
    idx = model->index(i,0,QModelIndex()); 
    datum = model->data(idx);
    var.push_back(datum);
}

Есть ли способ улучшить это, например, операцию копирования на более низком уровне, которую я мог бы использовать?

РЕДАКТИРОВАТЬ: Следуя совету бедуина, япопытался сделать это без QSqlTableModel, а просто путем итерации QSqlQuery.Это привело к значительно более низкой производительности.Например, операция копирования, которая заняла 380 мс с использованием вышеупомянутого метода, заняла 525 мс, итерируя по QSqlQuery, и с другими запросами были аналогичные различия.

1 Ответ

1 голос
/ 26 апреля 2011

Если вы просто хотите поместить данные, извлеченные из базы данных, в вектор, возможно, нет необходимости использовать QSqlTableModel. Вы просто можете использовать QSqlQuery . Вот пример:

QSqlQuery dbQuery(dbConnection); // constructing QSqlQuery with given connection

dbQuery.setForwardOnly(true); // pretends to speed up executions on some databases
dbQuery.setMode(Q3SqlCursor::ReadOnly);    

bool result = dbQuery.exec(queryString); // executing given query
if (!result) {
  //error processing
}
while (dbQuery.next()) {
  // column - desired column number to retrieve value. Count starts from 0.
  var.push_back(dbQuery.value(column));  
}

К сожалению, я не знаю ни одного способа сделать это без перебора результата QSqlQuery.

...