如何修复Qt中的“无查询无法获取行”

时间:2019-09-25 07:10:12

标签: c++ sql database sqlite qt

我有一个简单的sqlite3数据库,其中包含几个名称和ID。如果要提供ID,我想获取名称。如果我运行程序,会出现以下错误:

  

错误:“错误:”无查询无法获取行“   “从名称表中选择名称,其中id =%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 个答案:

答案 0 :(得分:1)

我认为您使用的占位符不正确。此外,查询字符串存在语法错误-右括号。您可能要尝试以下方法:

 [..]
 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()函数返回的内容。有了它,您可以在执行查询错误之前捕获它们。

答案 1 :(得分:0)

用'like'替换'='

     query.prepare("SELECT name FROM 
     name_table WHERE id like \'%1\' " )

答案 2 :(得分:0)

苦苦挣扎后,我发现了所有错误。

  1. db.setName需要数据库的文件路径(和扩展名),而不仅仅是文件名:
db.setName("C:/User/name/Documents/db.sqlite3"); 
  1. 我使用了占位符correctley(谢谢@vahancho)。它应该看起来像这样:
QSqlQuery query;
query.prepare("SELECT name FROM name_table WHERE id = ?");
query.bindValue(0, mInputText);`