Как исправить ошибку «Нет запроса Невозможно получить строку» в qt - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть простая база данных sqlite3, содержащая пару имен и идентификаторов.Я хочу получить имя, если указан идентификатор.Если я запускаю свою программу, я получаю следующую ошибку:

ОШИБКА: «ОШИБКА:« Нет запроса, невозможно получить строку »« ВЫБРАТЬ имя ИЗ ИМЕНИ_таблицы, ГДЕ ИД =% 1) »«

имя базы данных "dataname", а таблица, в которой находятся данные, "name_table". Ниже приведен мой код:

QSqlDatabase db;
   mInputText = ui->lineEdit->text();
   const QString DRIVER("QSQLITE");
   if(QSqlDatabase::isDriverAvailable(DRIVER)){

   db = QSqlDatabase::addDatabase(DRIVER);

}

   db.setHostName("localhost");
   db.setDatabaseName("dataname");

   db.open();

   if(!db.open()){
       qWarning() << "ERROR: " << db.lastError();
   }    
}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
     mInputText = ui->lineEdit->text();
     QSqlQuery query;
     query.prepare("SELECT name FROM name_table WHERE id = %1");
     query.bindValue("%1", mInputText);

     if(!query.exec())
         qWarning() << "ERROR: " << query.lastError().text();
     qDebug() << query.executedQuery();

     if(query.first())
         ui->mOutputText->setText(query.value(0).toString());
     else
         ui->mOutputText->setText("not found");


}

Может кто-нибудь помочь мне найти мою ошибку.новый для sql.Я думаю, что моей ошибкой может быть ".setHostName" или значение привязки запроса, но я все перепробовал и не могу заставить его работать. Заранее спасибо!

С уважением

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Я думаю, что вы используете заполнители неправильно.Кроме того, в строке запроса есть синтаксическая ошибка - закрывающая скобка.Вместо этого вы можете попробовать это:

 [..]
 query.prepare("SELECT name FROM name_table WHERE id = ?");
 query.bindValue(0, mInputText);
 [..]

или

 [..]
 query.prepare("SELECT name FROM name_table WHERE id = :id");
 query.bindValue(":id", mInputText);
 [..]

Также стоит проверить, что возвращает функция QSqlQuery::prepare().С его помощью вы можете отследить ошибки запроса, прежде чем выполнять их.

0 голосов
/ 25 сентября 2019

После многих попыток я нашел все ошибки.

  1. db.setName нужен путь к файлу (и расширение) к базе данных, а не только имя файла:
db.setName("C:/User/name/Documents/db.sqlite3"); 
Я использовал заполнители некорректно (спасибо @vahancho).Это должно выглядеть так:
QSqlQuery query;
query.prepare("SELECT name FROM name_table WHERE id = ?");
query.bindValue(0, mInputText);`
0 голосов
/ 25 сентября 2019

Заменить '=' на 'like'

     query.prepare("SELECT name FROM 
     name_table WHERE id like \'%1\' " )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...