【问题标题】:How to fix "No query Unable to fetch row" in qt如何修复 qt 中的“No query Unable to fetch row”
【发布时间】:2020-01-25 07:44:29
【问题描述】:

我有一个简单的 sqlite3 数据库,其中包含几个名称和 ID。如果给出了 id,我想得到名字。如果我运行我的程序,我会收到以下错误:

错误:“错误:“无查询无法获取行” "SELECT name FROM name_table WHERE 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”或查询绑定值,但我尝试了一切,但无法正常工作。提前致谢!

问候

【问题讨论】:

  • query.prepare() 调用返回什么?您的查询似乎有错误。注意最后的括号!
  • 我把括号去掉了,还是不行。我理解的方式是query.preparequery.bindValue用于设置查询,query.value(0).toString()应该返回一个字符串(不管名字是什么)

标签: c++ sql database sqlite qt


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

【讨论】:

  • 使用这些将错误更改为“参数计数不匹配”。 QSqlQuery::prepare() 返回false (我删除了括号,感谢指出!但我仍然有错误)
  • 那么,mInputText 变量的值是多少,你绑定的时候呢?
  • '1' (我将值输入到 lineEdit )。它应该返回名称“Will”
  • id 字段是文本字段还是数字字段?它的类型是什么?
  • 数字(整数)。我尝试将字符串更改为整数,但它仍然给出“参数计数不匹配”
【解决方案2】:

将“=”替换为“喜欢”

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

【讨论】:

  • 你能不能只显示打印的控制台输出 system.out.print("SELECT name FROM name_table WHERE id like \'%1\'")
  • 错误:“无查询无法获取行”。使用“喜欢”时。使用 query.prepare("SELECT name FROM name_table WHERE id = :id") 时,错误为“参数计数不匹配”
【解决方案3】:

经过一番努力,我找到了所有的错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-26
    • 1970-01-01
    • 2020-02-09
    • 2021-09-13
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多