qsqlquery::prepare+mysql odbc连接器

tct7dpnv  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(420)

我使用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))

有什么帮助吗?

0mkxixxg

0mkxixxg1#

对我来说,未命名的参数总是在 QSqlQuery . 例如:

if (db.open) {
    QSqlQuery q;
    if (q.prepare("SELECT id FROM Things WHERE parent_id = ?")) {
        q.bindValue(0, 1);
        if (q.exec) {
            //DO STUFF
}   }   }

用mysql(linux)、odbc(mingw)、qsqlite测试。

e5nszbig

e5nszbig2#

mysql 5在sql级别引入了存储过程支持,但是没有api来控制in、out和inout参数。因此,必须使用sql命令而不是qsqlquery::bindvalue()来设置和读取参数。
尽量避免捆绑http://doc.qt.io/qt-5/sql-driver.html,使用过程或动态添加参数:

public void mtd(int param)
   {
   if (q.prepare("SELECT id FROM Things WHERE 
        parent_id ='"+param+"'")) {
       if (q.exec) {
        //DO STUFF
   }
   }}
wbgh16ku

wbgh16ku3#

上次我遇到一个类似的问题,即准备好的查询无法工作,这是因为一个旧的数据库驱动程序。
基本上一些第三方程序 mysql.dll 在我的道路上。当我的qt应用程序运行时,加载的是旧的dll而不是新的dll。新旧版本之间的差异足以使qt无法准备查询。
因此,我建议您检查您的软件是否加载了与数据库相关的DLL的正确版本。
而且并非所有的qt驱动程序都支持预先准备好的查询,因此您应该检查 QSqlDriver::hasFeature(QSqlDriver::PreparedQueries) 对于您使用的驱动程序,返回true。
注意我的情况 QSqlDriver::hasFeature(QSqlDriver::PreparedQueries) 返回true,因为预期的dll版本应该支持准备好的查询。

相关问题