Проблема с sql запросом



  • День добрый. В очередной раз прошу вашей помощи в свзяи со странным поведением sql запроса. Данные из таблицы не возвращаются, проверка на isValid не проходит. Примечательно, что в этом же файле есть несколько других запросов, обращающихся к той же базе данных и тем же таблицам, выполняющихся корректно. Вот код:
    @

                    QString name;
                    QString nameOfCreator;
                    QStringList list;
                    QStringList exhibitors;
                    QStringList ListOfTheGroups;
                    QStringList ListOfPasswords;
                    in>>name>>list;
                    QSqlQuery query;
                    //name VARCHAR(30) PRIMARY KEY, creator VARCHAR(30),exhibitors TEXT, files TEXT, password VARCHAR(20)"
                    for(int i=0;i<list.count();i++)
                    {
    
                        //Here is a location of problem with joining into group.
                        //query do not get a value from table Groups
                        query.exec&#40;"SELECT * FROM Groups WHERE name='"+list.at(i&#41;+"'");
                        if(query.isNull(0))
                            qDebug()<<query.lastError();
                        else
                        {
                            qDebug()<<"In table Groups was selected:"<<query.value(0)<<query.value(1)<<query.value(2)<<query.value(3)<<query.value(4);
                        }
                        if(query.isValid())
                        {
                            exhibitors.append(query.value(2).toStringList());
                            nameOfCreator=query.value(1).toString();
                        }
                        if((name!=nameOfCreator)&&(!exhibitors.contains(name)))
                        {
                            ListOfTheGroups.append(query.value(1).toString());
                            ListOfPasswords.append(query.value(3).toString());
                        }
                    }
    
                    QByteArray data;
                    QDataStream out(&data, QIODevice::WriteOnly);
                    out<<(quint16)0;
                    out<<MyClient::SendToClientListOfPasswords;
                    out<<ListOfTheGroups;
                    out<<ListOfPasswords;
                    out.device()->seek(0);
                    out<<(quint16)(data.size()-sizeof(quint16));
                    _sok->write(data);
                    _sok->flush();
                }
                    break;@
    

    Вопрос в догонку: это может быть связано с переносом проекта с одной среды на другую? У меня несколько сред Qt и работаю поочерёдно на обоих. Конфигурация одна и таже, но мало ли...

    Заранее спасибо.



  • А что говорит qDebug() 17 и 20 строки?
    так не понятно какую проблему решаем.



  • Немного доделал запрос чтобы точно выяснить в чём дело. Получилось так:

                    @QString name;
                    QString nameOfCreator;
                    QStringList list;
                    QStringList exhibitors;
                    QStringList ListOfTheGroups;
                    QStringList ListOfPasswords;
                    in>>name>>list;
                    QSqlQuery query;
                    //name VARCHAR(30) PRIMARY KEY, creator VARCHAR(30),exhibitors TEXT, files TEXT, password VARCHAR(20)"
                    for(int i=0;i<list.count();i++)
                    {
    
    
                        query.exec&#40;"SELECT * FROM Groups WHERE name='"+list.at(i&#41;+"'");
                        if(!query.isActive())
                            qDebug()<<query.lastError();
                        else
                        {
                            qDebug()<<"In table Groups was selected:"<<query.value(0).toString()<<query.value(1).toString()<<query.value(2).toString()<<query.value(3).toString()<<query.value(4).toString();
                        }
                        if(query.isValid())
                        {
                            exhibitors.append(query.value(2).toStringList());
                            nameOfCreator=query.value(1).toString();
                        }
                        else
                            qDebug()<<query.lastError();@
    

    На
    @qDebug()<<"In table Groups was selected:"<<query.value(0).toString()<<query.value(1).toString()<<query.value(2).toString()<<query.value(3).toString()<<query.value(4).toString();

    ...

    qDebug()<<query.lastError();@

    говорит соответственно:
    @
    In table Groups was selected: "" "" "" "" ""
    QSqlError(-1, "", "")
    @

    Я так понимаю, дело в значениях таблицы. У меня начались серьёзные проблемы с работой БД. Долшло до того, что система выполняет всего один запрос в БД, после чего начинается вышеописанное.

    Метод заполнения таблиц следующий:

                    @
                    QString nameOfCreator;
                    QString nameOfTheGroup;
                    QString listOfTheGroupExhibitors;
                    QString passwordOfTheNewGroup;
                    QStringList listOfAlreadyExistingGroups;
    
                    in>>nameOfCreator>>nameOfTheGroup>>listOfTheGroupExhibitors>>passwordOfTheNewGroup;
    
                    QSqlQuery query;
    
                    if(!listOfTheGroupExhibitors.contains(nameOfCreator))
                        listOfTheGroupExhibitors.insert(0,nameOfCreator);
    
                    query.exec&#40;"SELECT name FROM Groups"&#41;;
                    while(query.next())
                        listOfAlreadyExistingGroups.append(query.value(0).toString());
    
                    if(!listOfAlreadyExistingGroups.contains(nameOfTheGroup))
                    {
                        query.exec&#40;"INSERT INTO Groups(name, creator, exhibitors, files, password&#41;" "VALUES(:name,:creator,:exhibitors,:files,:password)");
                        query.bindValue(":name",nameOfTheGroup);
                        query.bindValue(":creator",nameOfCreator);
                        query.bindValue(":exhibitors",listOfTheGroupExhibitors);
                        query.bindValue(":files",NULL);
                        query.bindValue(":password",NULL);
                        query.exec&#40;&#41;;
                    }@
    

    Я так понимаю, встаёт вопрос о смене формата вводимых данных с QString на что-то другое. Что это может быть, если формат таблиц:
    @name VARCHAR(30) PRIMARY KEY, creator VARCHAR(30),exhibitors TEXT, files TEXT, password VARCHAR(20)"

    Groups (name VARCHAR(30) PRIMARY KEY, creator VARCHAR(30),exhibitors TEXT, files TEXT, password VARCHAR(20))@

    В перспективе будет и BLOB. "Тему также развиваю здесь.":http://qt-project.org/forums/viewthread/16014/


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.