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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlQuery - получить результат команды  (Прочитано 9834 раз)
neosapient
Гость
« : Июль 19, 2010, 12:08 »

Здравствуйте.

Есть таблица в БД на MySQL. Требуется обновить значение в определенной строке, либо добавить строку, если её не существует.

Делаю так:
Код:
QSqlQuery query()
query.prepare("UPDATE UserInfo set balance = ? , where login = ?");
query.addBindValue(balance);
query.addBindValue(login);
if(query.exec()==false){ //??? надо проверить правильность результата
query.prepare("INSERT INTO UserInfo (login, balance) VALUES (?, ?)");
query.addBindValue(item.login);
query.addBindValue(item.balance);
query.exec();
}

Загвоздка в том, что для записей, которые уже существуют, я делаю UPDATE, а затем повторно пытаюсь создать запись.
Какой из методов в классе QSqlQuery сообщит мне результат операции "UPDATE" ?
Записан
dio
Гость
« Ответ #1 : Июль 19, 2010, 12:29 »

Используйте функцию mysql - ROW_COUNT().
http://www.mysql.ru/docs/mysql-man-5.0-en/functions.html#function_row-count
Записан
neosapient
Гость
« Ответ #2 : Июль 19, 2010, 15:07 »

Используйте функцию mysql - ROW_COUNT().
http://www.mysql.ru/docs/mysql-man-5.0-en/functions.html#function_row-count
Думаю, что эта функция мне не поможет, так как для операции UPDATE количество строк не меняется
Записан
crossly
Гость
« Ответ #3 : Июль 19, 2010, 15:20 »

а почему бы не проверить наличие записи а потом уже решать вставлять или добавлять... ??
Записан
neosapient
Гость
« Ответ #4 : Июль 19, 2010, 16:42 »

а почему бы не проверить наличие записи а потом уже решать вставлять или добавлять... ??

Можно, так и буду делать, если ничего не выйдет с проверкой результатов UPDATE.

Просто, в моем понимании sql-сервер сам делает эту проверку - не хочется по нескольку раз заставлять сервер делать проверки.  Улыбающийся

Записан
SimpleSunny
Гость
« Ответ #5 : Июль 19, 2010, 17:00 »

Посмотрите на int QSqlQuery::numRowsAffected () const.
Записан
neosapient
Гость
« Ответ #6 : Июль 20, 2010, 11:48 »

Попробовал, для sql-команды UPDATE, метод QSqlQuery::numRowsAffected () всегда возвращает -1 (вне зависимости, существует запись или нет)
Так, что такой метод не подходит.

Есть ещё идеи, или все же предеться делать проверку через SELECT ?


Код:
QSqlQuery query()
query.prepare("UPDATE UserInfo set balance = ? , where login = ?");
query.addBindValue(balance);
query.addBindValue(login);
query.exec();
qDebug() << QString::number(login) << QString::number(query.numRowsAffected());
if(query.numRowsAffected()==false){ //??? надо проверить правильность результата
query.prepare("INSERT INTO UserInfo (login, balance) VALUES (?, ?)");
query.addBindValue(item.login);
query.addBindValue(item.balance);
query.exec();
}
Записан
SimpleSunny
Гость
« Ответ #7 : Июль 20, 2010, 12:31 »

А попробуйте после query.exec() посмотреть, может какой-то ответ хранится все же.
Имею виду while (query.next()) query.value();

Странно что поиском не воспользовались, была уже такая тема http://www.prog.org.ru/topic_11459_0.html
и последним сообщением приводится решение
« Последнее редактирование: Июль 20, 2010, 12:58 от SimpleSunny » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #8 : Июль 20, 2010, 17:17 »

а что в my_sql нет INSERT OR UPDATE STATEMENT ?
Записан
crossly
Гость
« Ответ #9 : Июль 21, 2010, 08:53 »

нет
Записан
SimpleSunny
Гость
« Ответ #10 : Июль 21, 2010, 11:27 »

Цитировать
12.2.5.3. INSERT ... ON DUPLICATE KEY UPDATE Syntax
If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed. For example, if column a is declared as UNIQUE and contains the value 1, the following two statements have identical effect:
Код
SQL
INSERT INTO TABLE (a,b,c) VALUES (1,2,3)
 ON DUPLICATE KEY UPDATE c=c+1;
 
UPDATE TABLE SET c=c+1 WHERE a=1;
 
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #11 : Июль 21, 2010, 15:54 »

Кхм...
Первая же ссылка и ответила Шокированный
Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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