2012-03-20 3 views
1

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

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()); 
} 
+0

Даже если он очень хорошо разработан, Qt является сложным и занимает много времени, чтобы освоить. Пожалуйста, не извиняйтесь за незнание. –

+0

Спасибо, но на самом деле, прошло около двух недель с тех пор, как я начал. Овладение чем-то подобным я уверен, может взять меня на всю жизнь, хотя, особенно если они продолжают обновлять LOL, но до сих пор я действительно наслаждаюсь тем, как действует Qt. – Rob

ответ

2

Первая проблема в предоставленном коде должен делать с тем, как вы манипулировать 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... 
    } 
} 
+0

Отличная помощь благодаря – Rob

Смежные вопросы