#c #sql #database #qt
#c #sql #База данных #qt
Вопрос:
Ниже приводится инструкция sql
QString myQuery = "UPDATE myTable SET myAttr = :myAttr WHERE ID = 1";
//m_query is a QSqlQuery object pointer
m_query->prepare(myQuery);
QString value = "some value";
m_query->bindValue(":myAttr", QVariant(value)) ;
m_query->exec();
But when I print the executedQuery, it shows the value for **myAttr = ?**
Выполнение не вызывает никаких жалоб на bindValue().
Кто-нибудь в курсе, что здесь происходит? Я использую QT5.2.1 MinGW_32bits
Заранее спасибо.
Комментарии:
1. Я не уверен, но
executedQuery
не покажет вам запрос с привязанным значением. Просто строка с заполнителем2. @tema спасибо за ответ. Однако я дважды проверил выполняемый запрос в qt, и он показывает следующее: в большинстве случаев эта функция возвращает ту же строку, что и lastQuery(). Если подготовленный запрос с заполнителями выполняется в СУБД, которая его не поддерживает, подготовка этого запроса эмулируется. Заполнители в исходном запросе заменяются их связанными значениями для формирования нового запроса. Эта функция возвращает измененный запрос. Это в основном полезно для целей отладки.
3. В приведенной части документации четко указано, что значения в этой строке заменяются, только если СУБД (базовый драйвер базы данных) сама по себе не поддерживает привязку переменных. Это означает, что если вы используете MySQL, SQLite3, PostgreSQL, Oracle и т.д., То у вас это не сработает. Qt не может показать вам конечный выполняемый SQL, потому что драйвер базы данных скрывает его от Qt.
4. @Googie совершенно верно. Однако я думаю, что базовый драйвер базы данных поддерживает привязку переменных. Это отлично работает в более старой версии QT.
Ответ №1:
Я решил проблему, используя следующее:
change the :myAttr to :MYATTR
и когда вы привязываете значение, следуйте тому же формату.
m_query->bindValue(":MYATTR", QVariant(value)) **strong text**
Я думаю, что это проблема для более новой версии QtCreator.