Правильный способ использования QVariant при извлечении данных из базы данных - PullRequest
1 голос
/ 21 марта 2012

Я недавно начал работать с QT, и у меня возникла небольшая проблема.Я не могу понять, как работает QVariant.Я просматриваю помощь и смотрю онлайн, но она просто не тонет. В моем проекте я пытаюсь заполнить поле со списком производителей из базы данных.Я открыл базу данных и вытащил записи, но переименовал их все manValue.Теперь я понимаю, почему это происходит, проблема в том, что я не понимаю, как правильно использовать QVariant, чтобы получить желаемый результат.Первоначально я думал, что «manValue» будет идентификатором строки, в которой хранится фактическое значение из базы данных, но вместо этого он считывает значение из базы данных и проверяет, что оно не равно нулю, а затем переименовывает его.Я уже пытался создать строку, прежде чем назначить QVariant с какими-либо свойствами и присвоить ему текст, полученный из базы данных, а затем вставить эту строку, где manValue, но все еще не повезло.Любая помощь будет принята с благодарностью.Извините, я знаю, что это будет просто, я просто нуб, и справочные документы часто смущают меня.

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("LOCALHOST\\TestERPServer");
db.setDatabaseName("TestERPConnection");

if (db.open())
{
    QMessageBox::information(this,"Connected","Connection to the Database was Established\n"
                             "\nStatus: Connected");

    QSqlQuery mfrQry;

    if (mfrQry.exec("SELECT * FROM erp_data.manufacturers;"))
    {
        if (mfrQry.value(1) == "")
        {
            QMessageBox::information(this,"No Connection","Nothing in the Manufacturer Database\n"
                                     "\nError: " + db.lastError().text());
        }
        else
        {
            while (mfrQry.next())
            {
                ui->mfrComboBox->addItem("manValue",QVariant(mfrQry.value(1)));
            }
        }
    }
    else
    {
        QMessageBox::information(this,"No Connection","Connection to the Manufacturer Database could not be Established\n"
                                 "\nError: " + db.lastError().text());
    }
}
else
{
    QMessageBox::information(this,"No Connection","Connection to the Database could not be Established\n"
                             "\nError: " + db.lastError().text());
}

1 Ответ

2 голосов
/ 21 марта 2012

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

Успешно выполненные операторы SQL устанавливают активное состояние запроса, поэтому isActive () возвращает true.В противном случае состояние запроса устанавливается как неактивное.В любом случае при выполнении нового оператора SQL запрос располагается на недопустимой записи. Активный запрос должен быть перемещен к действительной записи, прежде чем можно будет извлечь значения.

Чтобы перейти к действительной записи, необходимо использовать одно из следующих действий:

Когда вы находитесь на действительной записи, вы должны использовать value()Функция для того, чтобы взять столбец, который вы хотите.Возвращаемое значение равно QVariant, поэтому вам нужно преобразовать его в нужный тип, используя одну из многих функций toSomething, предоставляемых QVariant.

Так что в вашем случае код должен выглядеть так:

QSqlQuery mfrQry;

if (mfrQry.exec("SELECT * FROM erp_data.manufacturers;"))
{
   // This will loop through all records returned by the query
   while (mfrQry.next()) {
         //  mfrQry.value(COLID) returns a QVariant containing the data of the current 
         // record in column COLID. 
         // Using toString we convert it to String
         QString stringValue = mfrQry.value(COLID).toString();
         // Now handle the QString the way you want...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...