Задать вопрос
@tschin

Почему не подставляются значения через bindValue в QSqlQuery?

Здравствуйте! Пытаюсь добавлять данные в БД через bindValue, однако, данные не байндятся.

Делаю вот что:
if(query.prepare("INSERT INTO messages (date, time, username, phone_number, text_message) VALUES (:date, :time, :name, :phone, :text)"))
    {
        query.bindValue(":date","1");
        query.bindValue(":time","1");
        query.bindValue(":name","1");
        query.bindValue(":phone","1");
        query.bindValue(":text","1");
        qDebug()<<query.lastError();
        query.exec();
}


потом через
qDebug()<<query.executedQuery();

смотрю запрос. И вижу вот это:
"INSERT INTO messages (date, time, username, phone_number, text_message) VALUES (?, ?, ?, ?, ?)"


также вывожу еще это:
qDebug()<<query.boundValues();

Вижу это:
QMap((":date", QVariant(QString, "1"))(":name", QVariant(QString, "1"))(":phone", QVariant(QString, "1"))(":text", QVariant(QString, "1"))(":time", QVariant(QString, "1")))


Вопрос: почему через bindValue не вставляются значения в текст запроса, а остаются вопросительные знаки?
  • Вопрос задан
  • 1090 просмотров
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
IGHOR
@IGHOR Куратор тега Qt
Qt/C++ DEV/CTO
query.executedQuery() не покажет реальный запрос, попробуйте так:
QString lastQuery = query.executedQuery();
    for (int i = 0, j = 0; j < query.boundValues().size(); ++j)
    {
        i = lastQuery.indexOf(QLatin1Char('?'), i);
        if (i <= 0)  break;
        const QVariant& var = query.boundValue(j);
        QSqlField field(QString(""), var.type());
        if (var.isNull())  field.clear();
        else  field.setValue(var);
        QString formatV = query.driver()->formatValue(field);
        lastQuery.replace(i, 1, formatV);
        i += formatV.length();
    }
qDebug()<<"SQL Query error:"<<lastQuery;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@eeiaao
bool ok = query.prepare("INSERT INTO messages (date, time, username, phone_number, text_message) VALUES (:date, :time, :name, :phone, :text)");
query.bindValue(":date","1");
query.bindValue(":time","1");
query.bindValue(":name","1");
query.bindValue(":phone","1");
query.bindValue(":text","1");

if (ok)
    query.exec();
else
    qDebug()<<query.lastError();
Ответ написан
pavel9609
@pavel9609
Студент-программист
Сделайте ветку else после prepare и выведите через qDebug() query.lastError() и посмотрите что вам напишет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы