QSqlQuery :: prepare + MySQL ODBC Connector - PullRequest
       62

QSqlQuery :: prepare + MySQL ODBC Connector

0 голосов
/ 21 ноября 2018

Я использовал драйвер MySQL от Qt с 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;");

Это все, что я сделал.Операторы SELECT без предложения WHERE работают должным образом, и я могу манипулировать базой данных через QSqlTableModel, как и раньше.

Просто привязка перестала работать ... Я имею в виду, что привязанное значение есть, и qDebug возвращает это:

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

но теперь запрос не возвращает строк после exec;но также без ошибок ... это также работает:

q.prepare(QString("SELECT id FROM Things WHERE parent_id = '%1'").arg(1))

Любая помощь?

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

В прошлый раз у меня была похожая проблема с неработающими подготовленными запросами, это было из-за старого драйвера базы данных.

В основном какая-то сторонняя программа поместила старый mysql.dll в мой PATH.Когда мое приложение Qt работало, вместо новой загружалась старая DLL.Разницы между старой и новой версией было достаточно, чтобы Qt не смог подготовить запросы.

Поэтому я рекомендую вам проверить, загружает ли ваше программное обеспечение правильные версии ваших DLL-библиотек, связанных с базой данных.

Такжене все драйверы Qt поддерживают подготовленные запросы, поэтому вам следует проверить, возвращает ли QSqlDriver::hasFeature(QSqlDriver::PreparedQueries) значение true для используемого вами драйвера.

Обратите внимание, что в моем случае QSqlDriver::hasFeature(QSqlDriver::PreparedQueries) вернул значение true, поскольку ожидаемая версия DLL быладолжен поддерживать подготовленные запросы.

0 голосов
/ 01 декабря 2018

В 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
   }
   }}
0 голосов
/ 21 ноября 2018

У меня всегда работают безымянные параметры в 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.

...