我使用qt的mysql驱动程序和32位mingwqt。这是有效的:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("MyDatabase");
//SETUP
if (db.open) {
QSqlQuery q;
if (q.prepare("SELECT id FROM Things WHERE parent_id = :pid")) {
q.bindValue(":pid", 1);
qDebug() << boundValues();
if (q.exec) {
//DO STUFF
} } }
但是现在我使用的是64位msvsqt,我需要使用mysql-odbc连接器。我已经设置并更改了代码以反映:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("Driver={MySQL ODBC 8.0 Unicode Driver};DATABASE=MyDatabase;");
我就这么做了。没有where子句的select语句按预期工作,我可以像以前一样通过qsqltablemodel操作数据库。
只是绑定停止了。。。我的意思是绑定值在那里,qdebug返回:
qmap((“:pid”,qvariant(int,1)))
但是现在查询在exec之后不返回任何行;但也没有错误。。。这也适用于:
q.prepare(QString("SELECT id FROM Things WHERE parent_id = '%1'").arg(1))
有什么帮助吗?
3条答案
按热度按时间0mkxixxg1#
对我来说,未命名的参数总是在
QSqlQuery
. 例如:用mysql(linux)、odbc(mingw)、qsqlite测试。
e5nszbig2#
mysql 5在sql级别引入了存储过程支持,但是没有api来控制in、out和inout参数。因此,必须使用sql命令而不是qsqlquery::bindvalue()来设置和读取参数。
尽量避免捆绑http://doc.qt.io/qt-5/sql-driver.html,使用过程或动态添加参数:
wbgh16ku3#
上次我遇到一个类似的问题,即准备好的查询无法工作,这是因为一个旧的数据库驱动程序。
基本上一些第三方程序
mysql.dll
在我的道路上。当我的qt应用程序运行时,加载的是旧的dll而不是新的dll。新旧版本之间的差异足以使qt无法准备查询。因此,我建议您检查您的软件是否加载了与数据库相关的DLL的正确版本。
而且并非所有的qt驱动程序都支持预先准备好的查询,因此您应该检查
QSqlDriver::hasFeature(QSqlDriver::PreparedQueries)
对于您使用的驱动程序,返回true。注意我的情况
QSqlDriver::hasFeature(QSqlDriver::PreparedQueries)
返回true,因为预期的dll版本应该支持准备好的查询。