Russian Qt Forum
Март 29, 2024, 00:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Копирование QSqlQuery  (Прочитано 4443 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Ноябрь 08, 2015, 12:11 »

Привет, друзья!
Столкнулся с проблемой. У меня есть функция, которая подготавливает запрос, а функция, которая её вызывает расширяет этот запрос.
Код
C++ (Qt)
QSqlQuery DataBaseDialog::getPreparedRollMetalQuery(const RollMetall &rollMetall, const QString& tableName) const{
   QSqlQuery query;
   query.prepare(QString("SELECT NAME "
                 "FROM %1 "
                 "WHERE H = :h AND B = :b AND S = :s AND R1 = :r1 AND R2 = :r2 ").arg(tableName));
   query.bindValue(":table", tableName);
   query.bindValue(":h", rollMetall.h);
   query.bindValue(":b", rollMetall.b);
   query.bindValue(":s", rollMetall.s);
   query.bindValue(":r1", rollMetall.r1);
   query.bindValue(":r2", rollMetall.r2);
   qDebug() << query.boundValues();
   return query;
}
 
QString DataBaseDialog::getChannelName(const Channel &channel) const{
   static const QString tableName = "Channels";
   QSqlQuery query = getPreparedRollMetalQuery(channel, tableName);
   const QString queryTemplate = query.lastQuery() +
           "AND T = :t AND ALPHA = :alpha AND GN = :gn";
 
   query.prepare(queryTemplate);
   query.bindValue(":t", channel.t);
   query.bindValue(":alpha", channel.alpha);
   query.bindValue(":gn", channel.gN);
   qDebug() << query.boundValues();
 
 
   if(query.exec() && query.next()){
       return query.value(0).toString();
   }
   return QString();
}
 
 
 
Так вот, почему-то при возврате QSqlQuery теряются boundValues, они становятся QVariant(invalid).
В чём проблема?
« Последнее редактирование: Ноябрь 11, 2015, 09:22 от __Heaven__ » Записан
GraninDm
Гость
« Ответ #1 : Ноябрь 09, 2015, 09:28 »

В исходниках можно посмотреть
QSQlQuery::prepare вызывает вот этот метод

Код:
bool QSqlResult::savePrepare(const QString& query)
{
    Q_D(QSqlResult);
    if (!driver())
        return false;
    d->clear();
    d->sql = query;
    if (!driver()->hasFeature(QSqlDriver::PreparedQueries))
        return prepare(query);

    // parse the query to memorize parameter location
    d->executedQuery = d->namedToPositionalBinding(query);

    if (driver()->hasFeature(QSqlDriver::NamedPlaceholders))
        d->executedQuery = d->positionalToNamedBinding(query);

    return prepare(d->executedQuery);
}

В нем соответственно все очищается.
Я так думаю...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Ноябрь 09, 2015, 10:15 »

Вы оказались правы. Спасибо.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Ноябрь 11, 2015, 07:56 »

Я написал класс-наследник, который перед prepare сохраняет все значения, а потом их снова биндит. Но это не помогает...
Код
C++ (Qt)
   qDebug() << query.boundValues();
   qDebug() << query.lastQuery();
   if(query.exec()){
           if(query.next()){
       return query.value(0).toString();
   }}
   qDebug() << query.executedQuery();
 
Код:
QMap((":alpha", QVariant(double, 0))(":b", QVariant(double, 0))(":gn", QVariant(double, 0))(":h", QVariant(double, 0))(":r1", QVariant(double, 0))(":r2", QVariant(double, 0))(":s", QVariant(double, 0))(":t", QVariant(double, 0))(":table", QVariant(QString, "Channels")))
"SELECT NAME FROM :table WHERE H = :h AND B = :b AND S = :s AND R1 = :r1 AND R2 = :r2 AND T = :t AND ALPHA = :alpha AND GN = :gn"
"SELECT NAME FROM ? WHERE H = ? AND B = ? AND S = ? AND R1 = ? AND R2 = ? AND T = ? AND ALPHA = ? AND GN = ?"
QSqlError("", "Parameter count mismatch", "")
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Ноябрь 11, 2015, 07:57 »

Точнее перестало работать, когда я добавил :table
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Ноябрь 11, 2015, 08:11 »

Имя таблицы биндить нельзя. Попробуйте подставлять его в саму строку запроса через %1 и arg.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Ноябрь 11, 2015, 09:22 »

Спасибо. Оставил так.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 22.