April 3, 2012

House15 House15
Lab Rat
57 posts

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

 

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

  1.                     QString name;
  2.                     QString nameOfCreator;
  3.                     QStringList list;
  4.                     QStringList exhibitors;
  5.                     QStringList ListOfTheGroups;
  6.                     QStringList ListOfPasswords;
  7.                     in>>name>>list;
  8.                     QSqlQuery query;
  9.                     //name VARCHAR(30) PRIMARY KEY, creator VARCHAR(30),exhibitors TEXT, files TEXT, password VARCHAR(20)"
  10.                     for(int i=0;i<list.count();i++)
  11.                     {
  12.  
  13.                         //Here is a location of problem with joining into group.
  14.                         //query do not get a value from table Groups
  15.                         query.exec("SELECT * FROM Groups WHERE name='"+list.at(i)+"'");
  16.                         if(query.isNull(0))
  17.                             qDebug()<<query.lastError();
  18.                         else
  19.                         {
  20.                             qDebug()<<"In table Groups was selected:"<<query.value(0)<<query.value(1)<<query.value(2)<<query.value(3)<<query.value(4);
  21.                         }
  22.                         if(query.isValid())
  23.                         {
  24.                             exhibitors.append(query.value(2).toStringList());
  25.                             nameOfCreator=query.value(1).toString();
  26.                         }
  27.                         if((name!=nameOfCreator)&&(!exhibitors.contains(name)))
  28.                         {
  29.                             ListOfTheGroups.append(query.value(1).toString());
  30.                             ListOfPasswords.append(query.value(3).toString());
  31.                         }
  32.                     }
  33.  
  34.                     QByteArray data;
  35.                     QDataStream out(&data, QIODevice::WriteOnly);
  36.                     out<<(quint16)0;
  37.                     out<<MyClient::SendToClientListOfPasswords;
  38.                     out<<ListOfTheGroups;
  39.                     out<<ListOfPasswords;
  40.                     out.device()->seek(0);
  41.                     out<<(quint16)(data.size()-sizeof(quint16));
  42.                     _sok->write(data);
  43.                     _sok->flush();
  44.                 }
  45.                     break;

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

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

2 replies

April 3, 2012

Skyrim Skyrim
Lab Rat
45 posts

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

April 5, 2012

House15 House15
Lab Rat
57 posts

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

  1. QString name;
  2.                     QString nameOfCreator;
  3.                     QStringList list;
  4.                     QStringList exhibitors;
  5.                     QStringList ListOfTheGroups;
  6.                     QStringList ListOfPasswords;
  7.                     in>>name>>list;
  8.                     QSqlQuery query;
  9.                     //name VARCHAR(30) PRIMARY KEY, creator VARCHAR(30),exhibitors TEXT, files TEXT, password VARCHAR(20)"
  10.                     for(int i=0;i<list.count();i++)
  11.                     {
  12.  
  13.  
  14.                         query.exec("SELECT * FROM Groups WHERE name='"+list.at(i)+"'");
  15.                         if(!query.isActive())
  16.                             qDebug()<<query.lastError();
  17.                         else
  18.                         {
  19.                             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();
  20.                         }
  21.                         if(query.isValid())
  22.                         {
  23.                             exhibitors.append(query.value(2).toStringList());
  24.                             nameOfCreator=query.value(1).toString();
  25.                         }
  26.                         else
  27.                             qDebug()<<query.lastError();

На

  1. 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();
  2.  
  3. ...
  4.  
  5. qDebug()<<query.lastError();

говорит соответственно:

  1. In table Groups was selected: "" "" "" "" ""
  2. QSqlError(-1, "", "")

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

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

  1.                     QString nameOfCreator;
  2.                     QString nameOfTheGroup;
  3.                     QString listOfTheGroupExhibitors;
  4.                     QString passwordOfTheNewGroup;
  5.                     QStringList listOfAlreadyExistingGroups;
  6.  
  7.                     in>>nameOfCreator>>nameOfTheGroup>>listOfTheGroupExhibitors>>passwordOfTheNewGroup;
  8.  
  9.                     QSqlQuery query;
  10.  
  11.                     if(!listOfTheGroupExhibitors.contains(nameOfCreator))
  12.                         listOfTheGroupExhibitors.insert(0,nameOfCreator);
  13.  
  14.                     query.exec("SELECT name FROM Groups");
  15.                     while(query.next())
  16.                         listOfAlreadyExistingGroups.append(query.value(0).toString());
  17.  
  18.                     if(!listOfAlreadyExistingGroups.contains(nameOfTheGroup))
  19.                     {
  20.                         query.exec("INSERT INTO Groups(name, creator, exhibitors, files, password)" "VALUES(:name,:creator,:exhibitors,:files,:password)");
  21.                         query.bindValue(":name",nameOfTheGroup);
  22.                         query.bindValue(":creator",nameOfCreator);
  23.                         query.bindValue(":exhibitors",listOfTheGroupExhibitors);
  24.                         query.bindValue(":files",NULL);
  25.                         query.bindValue(":password",NULL);
  26.                         query.exec();
  27.                     }

Я так понимаю, встаёт вопрос о смене формата вводимых данных с QString на что-то другое. Что это может быть, если формат таблиц:

  1. name VARCHAR(30) PRIMARY KEY, creator VARCHAR(30),exhibitors TEXT, files TEXT, password VARCHAR(20)"
  2.  
  3. Groups  (name VARCHAR(30) PRIMARY KEY, creator VARCHAR(30),exhibitors TEXT, files TEXT, password VARCHAR(20))

В перспективе будет и BLOB. Тему также развиваю здесь. [qt-project.org]

 
  ‹‹ Тарабарщина в QtCreator      QT Разработчик на проект. ››

You must log in to post a reply. Not a member yet? Register here!