crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Тема закрытаНачать новую тему
> [РЕШЕНО] QSqlQuery::prepare, не выполняется UPDATE
bayah
  опции профиля:
сообщение 23.11.2009, 18:20
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 23.11.2009
Пользователь №: 1249

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот еще...)
Не пойму, почему не получается именно обновить?

void MainForm::on_Ok_d_clicked()
{

    int id = ui->tableView_d->model()->index(0,0).data(0).toInt();
    int num=0;
    bool find=false;
    while(id != 0){  //по циклу просматриваю все первые поля
        if(id==ui->code_d_d->text().toInt()){find=true; break;}
        num=num+1;
        id = ui->tableView_d->model()->index(num,0).data(0).toInt();
    }
    ui->label_name_d_d->setNum(id); //это я просто смотрю какой id - найден ли он. Он находится.
    QSqlQuery query;
    if(find==true)
    {
        query.prepare("UPDATE DIST SET CODE_D = :CODE_D, NAME_D = :NAME_D WHERE CODE_D = :CODE_D");
        query.bindValue(":CODE_D",id);
        query.bindValue(":NAME_D",ui->name_d_d->text());
        query.exec();
    }
    else //[b]добавление новой записи работает[/b]
    {
        query.prepare("INSERT INTO DIST (CODE_D, NAME_D) VALUES (:CODE_D, :NAME_D) ");
        query.bindValue(":CODE_D",ui->code_d_d->text().toInt());
        query.bindValue(":NAME_D",ui->name_d_d->text());
        query.exec();
    }
    Refresh();
}




Да вообще UPDATE не проходит банально

        query.prepare("UPDATE DIST SET CODE_D = :CODE_D, NAME_D = :NAME_D WHERE CODE_D = :CODE_D");
        query.bindValue(":CODE_D",10); //запись с CODE_D=10 естественно есть в таблице
        query.bindValue(":NAME_D",ui->name_d_d->text());
        query.exec();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.11.2009, 18:35
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bayah @ 23.11.2009, 21:20) *
Да вообще UPDATE не проходит банально
попробуй свой запрос в sqlbrowser'е если там проходит, то смотреть код.
Я думаю, что запрос неверно составлен (в части передачи текста в него)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bayah
  опции профиля:
сообщение 24.11.2009, 17:28
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 23.11.2009
Пользователь №: 1249

Спасибо сказали: 0 раз(а)




Репутация:   0  


2 Litkevich Yuriy:

Цитата
попробуй свой запрос в sqlbrowser'е если там проходит, то смотреть код.
Я думаю, что запрос неверно составлен (в части передачи текста в него)


Проверил в sqlbrowser'е. Все работает. Вот еще пример который работает!!
Цитата
//создание самой таблицы
query.exec("CREATE TABLE Recivers (Inn_receiver INTEGER PRIMARY KEY ,"
"Title VARCHAR(100));");

//...обновление записи с Inn_receiver = 444
QSqlQuery query;
query.prepare("UPDATE Recivers SET Title = :Title WHERE Inn_receiver = :Inn_receiver ");
query.bindValue(":Title","Bla-bla-bla");
query.bindValue(":Inn_receiver",444);
query.exec();


А мой пример:

    query.exec("CREATE TABLE DIST ("
               "CODE_D INTEGER PRIMARY KEY NOT NULL, "
               "NAME_D VARCHAR(20) "
               ");");
//...
QSqlQuery query;
        query.prepare("UPDATE DIST SET CODE_D = :CODE_D,NAME_D = :NAME_D WHERE CODE_D = :CODE_D");
        query.bindValue(":NAME_D","tra-ta-ta");
        query.bindValue(":CODE_D", 31);
        query.exec();



Не пашет!
m_shok
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.11.2009, 17:32
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


в Firebird'е строки нужно было бы брать в кавычки, итого строка в prepare выглядела бы так:
"UPDATE DIST SET CODE_D = :CODE_D,NAME_D = \":NAME_D\" WHERE CODE_D = :CODE_D"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 24.11.2009, 17:59
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(Litkevich Yuriy @ 24.11.2009, 17:32) *
в Firebird'е строки нужно было бы брать в кавычки, итого строка в prepare выглядела бы так:
"UPDATE DIST SET CODE_D = :CODE_D,NAME_D = \":NAME_D\" WHERE CODE_D = :CODE_D"

Странно, это же связываемые переменные, там же не просто тупая подстановка должна быть (по крайней мере в Oracle и SQLite кавычки не нужны).

По делу: а на обновляемые поля не накладываются никакие ограничения целостости, которые нарушаются (например, уникальность)? Если запрос не прошел, то надо смотреть что выдаст нам драйвер: query.lastError().text()

Сообщение отредактировал MoPDoBoPoT - 24.11.2009, 18:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bayah
  опции профиля:
сообщение 25.11.2009, 15:22
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 23.11.2009
Пользователь №: 1249

Спасибо сказали: 0 раз(а)




Репутация:   0  


Блин, нашел...опять все оказалось банально.

Нельзя, чтобы было так:
Цитата
query.prepare("UPDATE DIST SET CODE_D = :CODE_D,NAME_D = :NAME_D WHERE CODE_D = :CODE_D");


то есть - поле, которое указано после WHERE не должно встречаться после SET
А вот такой запрос будет работать:
Цитата
query.prepare("UPDATE DIST SET NAME_D = :NAME_D WHERE CODE_D = :CODE_D");


Однако в QT sql brouser'е такой запрос работает:
Цитата
UPDATE DIST SET CODE_D='123', NAME_D='Gigi' WHERE CODE_D='31'


хм...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.11.2009, 18:01
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bayah @ 25.11.2009, 18:22) *
Однако в QT sql brouser'е такой запрос работает:
вот и я про тоже, пробуй так:
"UPDATE DIST SET CODE_D = ':CODE_D', NAME_D = ':NAME_D' WHERE CODE_D = ':CODE_D'"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 25.11.2009, 20:35
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


О, блин, я смекнул.
Во-первых, нельзя использовать плейсхолдер повторно, даже если значения одинаковые
query.prepare("UPDATE DIST SET CODE_D = :CODE_D, NAME_D = :NAME_D WHERE CODE_D = :CODE_D");
то есть должно быть примерно так:
        query.prepare("UPDATE DIST SET CODE_D = :CODE_D1, NAME_D = :NAME_D WHERE CODE_D = :CODE_D2");
        query.bindValue(":CODE_D1",10);
        query.bindValue(":NAME_D",ui->name_d_d->text());
        query.bindValue(":CODE_D2",10);
        query.exec();

Во-вторых, не вижу смысла в замене значения поля на тоже самое значение :)
UPDATE DIST SET CODE_D = :CODE_D, NAME_D = :NAME_D WHERE CODE_D = :CODE_D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.11.2009, 22:30
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


можно ставить "РЕШЕНО" и закрыть тему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bayah
  опции профиля:
сообщение 26.11.2009, 5:36
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 23.11.2009
Пользователь №: 1249

Спасибо сказали: 0 раз(а)




Репутация:   0  


MoPDoBoPoT, точно!...
кажется можно закрывать.
что такое плейсхолдер в примере ясно, а что это вообще такое?)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.7.2020, 8:19