QSqlQuery :: prepare + MySQL ODBC Connector

sms*_*are 8 mysql qt odbc qsqltablemodel qsqlquery

我正在使用Qt的MySQL驱动程序和32位MinGW Qt.这是有效的:

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
}   }   }
Run Code Online (Sandbox Code Playgroud)

但是现在我正在使用64位MSVS Qt,我需要使用MySQL ODBC Connector.我已经设置并更改了代码以反映:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("Driver={MySQL ODBC 8.0 Unicode Driver};DATABASE=MyDatabase;");
Run Code Online (Sandbox Code Playgroud)

这就是我所做的一切.没有WHERE子句的SELECT语句按预期工作,我可以像以前一样通过QSqlTableModel操作数据库.

这只是绑定停止工作......我的意思是绑定值在那里,qDebug返回:

QMap((":pid",QVariant(int,1)))

但是现在查询在exec之后没有返回任何行; 但也没有错误...这也有效:

q.prepare(QString("SELECT id FROM Things WHERE parent_id = '%1'").arg(1))
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Eng*_*yeb 0

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
   }
   }}
Run Code Online (Sandbox Code Playgroud)