本文共 1221 字,大约阅读时间需要 4 分钟。
1.从数据库sqlite查询parameter count mismatch 错误衍生的故事
写了一个数据库创建时是这样写的:QSqlQuery query;//判断表是否已经存在 QString sql = QString("select * from sqlite_master where name='%1'").arg("goods"); if(query.exec(sql)) return true; if (!query.exec("CREATE TABLE goods(" "id INT," "name VARCHAR," "number INT)")) { QMessageBox::critical(0, QObject::tr("Database Error"), query.lastError().text()); return false;}
乍一看没什么毛病,执行插入语句时是这样写的(其中id_in,name_in,number_in分别是int, Qstring, int类型):
query.prepare("insert into goods(id, name, number) values(:id_in,:name_in,:number_in)");query.bindValue(":id_in",id_in);query.bindValue(":name_in",name_in);query.bindValue(":number_in", number_in);if(!query.exec()){ QMessageBox::critical(0, QObject::tr("Database Error"), query.lastError().text()); return false;}
看似没什么毛病,但是插入的时候就会报“parameter count mismatch”错误,这是为什么呢?
然后我将编译的那个目录删掉,多运行了几次程序,发现这个错误导致直接无法插入,但是格式类型是正确的,所以我就思考是不是建表的时候出错了,然后我又把这些语句拿到PostgreeSQL中去试,发现没错啊,然后就盯上检查goods表是否存在的那条语句了。我把这条语句删了,把已经编译好的那个目录也删了,然后运行程序,正常了。好吧就是这里错了。最后错误是query.exec()这句返回的是语句是否正常运行。而要判断表是否存在需要query.next().通过查阅官方文档,发现exec()只要你的语法是正确的,可以正常执行那就返回true。而真正的查询结果是是通过next()来检索的。转载地址:http://vrftb.baihongyu.com/