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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: добавление +обновление данных в MySql из Qt  (Прочитано 9598 раз)
samovar7777
Гость
« : Июнь 13, 2009, 23:12 »

Добрый день!!!!! Помогите, пож-та , решить проблему, которая состоит в след.
Есть таблица из 10 полей,в которой заполнены 3 ключевых поля...мне необходимо довставить, дозаполнить остальные поля данными, взятыми из формы ввода...То есть если первые три поля в форме равны существующим значениям определенных столбцов, то дозаполнить остальные поля...В противном случае, необходимо вставить новую запись...Помогите перевести это на язык SQL-запроса. СУБД-MySql 5.1.

Делаю так:
QDate number1=deZapov2->date();
QString number2=leNumberKS2->text();
QString number3=leNumberZl2->text();
QSqlQuery query("INSERT rassled (dataVustav, NomerKS, PorydNomerZl, VchunVGr) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE rassled SET VchunVGr=cbVchunGr->currentText() WHERE dataVustav=number1, NomerKS=number2,PorydNomerZl=number3");
   query.addBindValue(deZapov2->date());
   query.addBindValue(leNumberKS2->text());
   query.addBindValue(leNumberZl2->text());
   query.addBindValue(cbVchunGr->currentText());
Пишет, что ошибки синтаксиса в MySql? А я не могу их исправить, поскольку не хватает знаний по данному вопросу. ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!
Буду весьма благодарен!!!
« Последнее редактирование: Июнь 13, 2009, 23:16 от samovar7777 » Записан
ритт
Гость
« Ответ #1 : Июнь 14, 2009, 02:55 »

очевидно ведь, что сначала происходит попытка выполнить запрос с вопросиками, а лишь затем к вопросикам биндятся значения.

QSqlQuery query("...");
заменить на
QSqlQuery query;
затем
query.prepare("...")
затем бинды и в завершение
query.exec()
Записан
samovar7777
Гость
« Ответ #2 : Июнь 14, 2009, 09:53 »

Спасибо Вам!!! Сейчас попробую так...
Записан
samovar7777
Гость
« Ответ #3 : Июнь 14, 2009, 10:12 »

 Шокированный Ура!! Ошибки уже нет....А вот запись не добавляет....
Записан
ритт
Гость
« Ответ #4 : Июнь 14, 2009, 10:16 »

и правильно. я бы тоже ругался...
кто такие number1..number3 ? что за запятые в where clause ?
и, некстати, где exec() ?

также советую изначально перенимать хороший тон написания подобных текстов, ака:
Код:
QSqlQuery query;
if(query.prepare("INSERT rassled (dataVustav, NomerKS, PorydNomerZl, VchunVGr) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE rassled SET VchunVGr=? WHERE blah AND blah AND blah"))
{
   query.addBindValue(deZapov2->date());
   query.addBindValue(leNumberKS2->text());
   query.addBindValue(leNumberZl2->text());
   query.addBindValue(cbVchunGr->currentText());
   query.addBindValue(cbVchunGr->currentText());

   query.exec();
}
Записан
samovar7777
Гость
« Ответ #5 : Июнь 14, 2009, 10:28 »

Люди добрые!!!! ПОМОГИТЕ МНЕ!!!!!! найти ошибку.. Непонимающий.....Ошибок синтаксиса уже нет, а вот запрос не вставляет записи....Я делаю так:
QSqlQuery query;
query.prepare("INSERT rassled (dataVustav, NomerKS, PorydNomerZl, VchunVGr) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE rassled SET VchunVGr=? WHERE dataVustav=number1, NomerKS=number2, PorydNomerZl=number3");
   query.addBindValue(deZapov2->date());
   query.addBindValue(leNumberKS2->text());
   query.addBindValue(leNumberZl2->text());
   query.addBindValue(cbVchunGr->currentText());
   query.addBindValue(cbVchunGr->currentText());
query.exec();
Где, dataVustav, NomerKS, PorydNomerZl-составной ключ таблицы rassled. При чем даже когда нет совпадений с ключом-все равно не вставляет....number1, number2, number3 считываются с формы...Заранее всем благодарен...
Записан
samovar7777
Гость
« Ответ #6 : Июнь 14, 2009, 10:53 »

и правильно. я бы тоже ругался...
кто такие number1..number3 ? что за запятые в where clause ?
и, некстати, где exec() ?

также советую изначально перенимать хороший тон написания подобных текстов, ака:
Код:
QSqlQuery query;
if(query.prepare("INSERT rassled (dataVustav, NomerKS, PorydNomerZl, VchunVGr) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE rassled SET VchunVGr=? WHERE blah AND blah AND blah"))
{
   query.addBindValue(deZapov2->date());
   query.addBindValue(leNumberKS2->text());
   query.addBindValue(leNumberZl2->text());
   query.addBindValue(cbVchunGr->currentText());
   query.addBindValue(cbVchunGr->currentText());

   query.exec();

Спасибо, Константин, за подсказку, но выполнив все рекомендации,по-прежнему не хочет :(не вставляет...ни новые, недобавляет к имеющимся) В чем еще может быть причина последнего?
Записан
samovar7777
Гость
« Ответ #7 : Июнь 14, 2009, 11:16 »

Уже сделал так:
QSqlQuery query;
query.prepare("INSERT rassled (dataVustav, NomerKS, PorydNomerZl, VchunVGr) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE rassled SET VchunVGr=? WHERE dataVustav=deZapov2->date() AND NomerKS=number2 AND PorydNomerZl=number3");
   query.addBindValue(deZapov2->date());
   query.addBindValue(leNumberKS2->text());
   query.addBindValue(leNumberZl2->text());
   query.addBindValue(cbVchunGr->currentText());
   query.addBindValue(cbVchunGr->currentText());
query.exec();
if (!query.isActive())
{QMessageBox::warning(this, tr("insert error"), query.lastError().text());}
else accept(); 
Запрос выполн. некорректно, поскольку выводится сообщение insert error, сам текст ошибки не выводит...В чем проблема, подскажите!!!!!!! Пожалуйста!!!!!
Записан
ритт
Гость
« Ответ #8 : Июнь 14, 2009, 11:22 »

и правильно. я бы тоже ругался...
кто такие number1..number3 ? что за запятые в where clause ?
<snip>
Записан
samovar7777
Гость
« Ответ #9 : Июнь 14, 2009, 11:28 »

и правильно. я бы тоже ругался...
кто такие number1..number3 ?

QDate number1=deZapov2->date();
QString number2=leNumberKS2->text();
QString number3=leNumberZl2->text();
Записан
ритт
Гость
« Ответ #10 : Июнь 14, 2009, 12:12 »

дык, какого хрена названия сишных переменных вписывать в запрос скл?! это что, пережитки пых-пыха?
Записан
samovar7777
Гость
« Ответ #11 : Июнь 14, 2009, 12:37 »

Итак, изменила типы пполей ключевых, теперь они у меня INT, кроме даты оно так и осталось датой...
Но не хочет вставлять даже константные значения....
QSqlQuery query;
query.prepare("INSERT rassled (dataVustav, NomerKS, PorydNomerZl, VchunVGr) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE rassled SET VchunVGr='rrrrrrrr' WHERE dataVustav='2000-01-01 00:00:00' AND NomerKS='44' AND PorydNomerZl='44' ");
   query.addBindValue(deZapov2->date());
   query.addBindValue(leNumberKS2->text());
   query.addBindValue(leNumberZl2->text());
   query.addBindValue(cbVchunGr->currentText());
   //query.addBindValue(cbVchunGr->currentText());
query.exec();
Записан
samovar7777
Гость
« Ответ #12 : Июнь 14, 2009, 12:40 »

дык, какого хрена названия сишных переменных вписывать в запрос скл?! это что, пережитки пых-пыха?

Нет, "не пережитки..", просто у мня программа на Qt подключает базу на MySql...поэтому по-другому невозможно...Ведь значения этих вводятся с формы...Кстати, обычная вставка записей в таблицу Мускула с такими же типами работает отлично...Происходит преобразование типов... А дозапись не хочет...
« Последнее редактирование: Июнь 14, 2009, 12:44 от samovar7777 » Записан
samovar7777
Гость
« Ответ #13 : Июнь 14, 2009, 12:46 »

Даже если явно преобразовать в INT все равно не хочет...
int number2=leNumberKS2->text().toInt();
int number3=leNumberZl2->text().toInt();
Записан
ритт
Гость
« Ответ #14 : Июнь 14, 2009, 13:27 »

если примари составной (dataVustav + NomerKS + PorydNomerZl), зачем при дупликейте эта странная попытка удостовериться, что значения действительно дублируются?
кстати, 12.2.5.1. INSERT ... SELECT Syntax говорит, что запрос неверный.
попробуй так:
Цитировать
INSERT rassled (dataVustav, NomerKS, PorydNomerZl, VchunVGr) VALUES (?, ?, ?, ?)
  ON DUPLICATE KEY UPDATE VchunVGr=?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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