QSqlQuery :: prepare + MySQL ODBC连接器

时间:2018-11-21 19:00:01

标签: mysql qt odbc qsqlquery qsqltablemodel

我正在将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
}   }   }

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

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 个答案:

答案 0 :(得分:0)

对我来说,始终在<ion-list> **<ng-container *ngFor="let image of observable | async">** <ion-item *ngIf="image.deletedAt === undefined"> <span class="item-container" (click)="showImage(image)"> <ion-thumbnail item-start> <img id="{{image.url}}" src="{{getUrl(image) + image.url}}"> </ion-thumbnail> <span> <p>created at: {{image.createdAt | date: 'd/M/yy H:m'}}</p> <p>created by: {{image.createdBy}}</p> </span> </span> <button ion-button item-end (click)="removeImage(image)"> <ion-icon name="trash"></ion-icon> </button> </ion-item> </ng-container> </ion-list> 中使用未命名的参数。 例如:

QSqlQuery

经过MySql(Linux),ODBC(mingw),QSqlite的测试。

答案 1 :(得分:0)

我上次遇到类似的问题,即准备好的查询无法正常工作,这是因为数据库驱动程序过旧。

基本上,一些第三方程序在我的PATH中放置了一个旧的mysql.dll。当我的Qt应用程序运行时,将加载旧的DLL,而不是较新的DLL。新旧版本之间的差异足以使Qt无法准备查询。

因此,我建议您检查软件是否正在加载与数据库相关的DLL的正确版本。

也不是所有的Qt驱动程序都支持准备好的查询,因此您应该检查QSqlDriver::hasFeature(QSqlDriver::PreparedQueries)是否对所使用的驱动程序返回true。

请注意,在我的情况下,QSqlDriver::hasFeature(QSqlDriver::PreparedQueries)确实返回true,因为DLL的预期版本应该支持准备好的查询。

答案 2 :(得分:0)

MySQL 5引入了SQL级别的存储过程支持,但没有用于控制IN,OUT和INOUT参数的API。因此,必须使用SQL命令而不是QSqlQuery :: bindValue()来设置和读取参数。

尝试避免绑定https://httpd.apache.org/docs/2.4/programs/rotatelogs.html,使用过程或动态添加参数:

Point p{3.14, 42.0};