Russian Qt Forum

Qt => Базы данных => Тема начата: neosapient от Июль 19, 2010, 12:08



Название: QSqlQuery - получить результат команды
Отправлено: 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" ?


Название: Re: QSqlQuery - получить результат команды
Отправлено: dio от Июль 19, 2010, 12:29
Используйте функцию mysql - ROW_COUNT().
http://www.mysql.ru/docs/mysql-man-5.0-en/functions.html#function_row-count (http://www.mysql.ru/docs/mysql-man-5.0-en/functions.html#function_row-count)


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


Название: Re: QSqlQuery - получить результат команды
Отправлено: crossly от Июль 19, 2010, 15:20
а почему бы не проверить наличие записи а потом уже решать вставлять или добавлять... ??


Название: Re: QSqlQuery - получить результат команды
Отправлено: neosapient от Июль 19, 2010, 16:42
а почему бы не проверить наличие записи а потом уже решать вставлять или добавлять... ??

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

Просто, в моем понимании sql-сервер сам делает эту проверку - не хочется по нескольку раз заставлять сервер делать проверки.  :)



Название: Re: QSqlQuery - получить результат команды
Отправлено: SimpleSunny от Июль 19, 2010, 17:00
Посмотрите на int QSqlQuery::numRowsAffected () const.


Название: Re: QSqlQuery - получить результат команды
Отправлено: neosapient от Июль 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();
}


Название: Re: QSqlQuery - получить результат команды
Отправлено: SimpleSunny от Июль 20, 2010, 12:31
А попробуйте после query.exec() посмотреть, может какой-то ответ хранится все же.
Имею виду while (query.next()) query.value();

Странно что поиском не воспользовались, была уже такая тема http://www.prog.org.ru/topic_11459_0.html
и последним сообщением приводится решение


Название: Re: QSqlQuery - получить результат команды
Отправлено: break от Июль 20, 2010, 17:17
а что в my_sql нет INSERT OR UPDATE STATEMENT ?


Название: Re: QSqlQuery - получить результат команды
Отправлено: crossly от Июль 21, 2010, 08:53
нет


Название: Re: QSqlQuery - получить результат команды
Отправлено: SimpleSunny от Июль 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;
 


Название: Re: QSqlQuery - получить результат команды
Отправлено: serg_hd от Июль 21, 2010, 15:54
Кхм... (http://lmgtfy.com/?q=mysql+%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D0%BB%D0%B8%D0%B1%D0%BE+%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C)
Первая же ссылка и ответила :o