Russian Qt Forum

Qt => Базы данных => Тема начата: Larry от Февраль 04, 2011, 00:06



Название: QSqlQuery
Отправлено: Larry от Февраль 04, 2011, 00:06
Добрый вечер, форумчане! Возник такой вопрос. У меня есть 2 таблицы:
id | name - это поля первой таблицы
id | name | genre - это поля второй таблицы(их немного больше...)

первая таблица называется "genre", а вторая "film"... в поле name первой таблицы забиты жанры...Мне надо выбрать из таблицы "film" все строки в которых genre(поле второй таблицы) совпадают с name первой таблицы.

Вот что я сделал, но этот запрос не работает...
 
Код:
QSqlQuery   query;
QSqlRecord  record;
QString     strQuery = "select name from genre";

QStringList strListGenre;

query.exec(strQuery);
record = query.record();

while(query.next())
        strListGenre << query.value(record.indexOf("name")).toString();

foreach(QString str, strListGenre)
{
strQuery = "SELECT name FROM film WHERE genre = '" + str + "'";

if(query.exec(strQuery))
qDebug() << QObject::tr("Работает!");
else
qDebug() << QObject::tr("Не работает");

record = query.record();
QString film = query.value(record.indexOf("name")).toString();

qDebug() << film;
}
первый запрос вытягивает все данные из первой таблицы, а вот второй не работает, только выдает: QSqlQuery::value: not positioned on a valid record


Название: Re: QSqlQuery
Отправлено: serg_hd от Февраль 04, 2011, 00:48
это надо делать средствами mysql и одним запросом, что-то типа:
Код
SQL
SELECT * FROM `film` WHERE genre IN (SELECT name FROM `genre`)
 


Название: Re: QSqlQuery
Отправлено: Larry от Февраль 04, 2011, 00:55
спасибо я попробую...а почему не получается так как я написал? вроде бы и ошибок нет и все проходит, но данные не вытягиваются?


Название: Re: QSqlQuery
Отправлено: serg_hd от Февраль 04, 2011, 00:59
спасибо я попробую...а почему не получается так как я написал? вроде бы и ошибок нет и все проходит, но данные не вытягиваются?

Потому что надо позиционировать указатель на новые данные:
Код
C++ (Qt)
QString film;
...
if (query.exec(strQuery))
{
qDebug() << QObject::tr("Работает!");
if (query.next())
{
 record = query.record();
 film = query.value(record.indexOf("name")).toString();
 qDebug() << film;
}
}
else
qDebug() << QObject::tr("Не работает");
 

И вообще, раз уж стоит проверка на "Не работает", лучше заодно почитать почему именно:
Код
C++ (Qt)
if(query.exec(strQuery))
qDebug() << QObject::tr("Работает!");
else
qDebug() << tr("Ошибка:") << query.lastError().text();
 
 


Название: Re: QSqlQuery
Отправлено: Larry от Февраль 04, 2011, 22:11
serg_hd, спасибо большое все работает :)