2

QtでSQliteデータベースを処理するこのクラスDatabaseManagerがあります。問題は、データベースにレコードが含まれていてもクエリが「No query Unable to fetch row」を返し、何も返さない場合があり、クエリが完全に正常に動作する場合があります。この問題を解決するのに役立ちますか?

ここにクラスがあります:

class DatabaseManager
{
private:
    QSqlDatabase PatternLibrary;
    QSqlQuery query;


public:
    Pattern pattern;
    std::vector<Pattern> allPatterns;
    std::vector<QString> patternNames;
    std::vector<RECTANGLE> rectangles_;
    DatabaseManager()
    {
        PatternLibrary = QSqlDatabase::addDatabase( "QSQLITE" );
        PatternLibrary.setDatabaseName("mydb");
        bool opened = PatternLibrary.open();
        query = QSqlQuery(PatternLibrary);
        if(opened)
        {
            qDebug( "Connected!");
            query.prepare( "CREATE TABLE IF NOT EXISTS Pattern (patternName         VARCHAR(30),RectangleID INTEGER ,X1 INTEGER, Y1 INTEGER, X2 INTEGER, Y2 INTEGER,X3     INTEGER,Y3 INTEGER, X4 INTEGER, Y4 INTEGER,PRIMARY KEY (patternName,RectangleID))" );
            bool create = query.exec();
            if(!create)
            {
                qDebug() <<PatternLibrary.lastError().text();
            }

        }
        else
        {
            qDebug() << PatternLibrary.lastError().text();
            qFatal( "Failed to connect." );
        }
        query.clear();
    }

//******************************************************************************//
 bool select_all_records()
    {
        query = QSqlQuery(PatternLibrary);
        query.clear();
        if(PatternLibrary.open())
        {
            query.prepare( "SELECT* FROM Pattern");
            if(!query.exec())
            {
                qDebug() << query.lastError().text();
                query.clear();
                return false;
            }
            else
            {
                int PatternCount=0;
                QString temp1="",temp2="";
                patternNames.clear();
                while( query.next() )
                {
                    temp1 = query.value(0).toString();
                    if(temp1 !=temp2)
                    {
                        PatternCount++;
                        temp2 = temp1;
                        patternNames.push_back(temp1);
                    }
                    RECTANGLE Rect;
                    Rect.patternName = query.value(0).toString();
                    Rect.rectangleId = query.value(1).toInt();
                    Rect.X1 = query.value(2).toInt();
                    Rect.Y1 = query.value(3).toInt();
                    Rect.X2 = query.value(4).toInt();
                    Rect.Y2 = query.value(5).toInt();
                    Rect.X3 = query.value(6).toInt();
                    Rect.Y3 = query.value(7).toInt();
                    Rect.X4 = query.value(8).toInt();
                    Rect.Y4 = query.value(9).toInt();
                    rectangles_.push_back(Rect);
                }
                for(unsigned int i =0;i<patternNames.size();i++)
                {
                    Pattern newPattern;
                    newPattern.PatternName = patternNames.at(i);
                    for(unsigned int j =0;j<rectangles_.size();j++)
                    {
                        if(rectangles_[j].patternName == newPattern.PatternName)
                        {
                            newPattern.pattern_.push_back(rectangles_[j]);
                            rectangles_.erase(rectangles_.begin()+j);
                            j--;
                        }

                    }
                    allPatterns.push_back(newPattern);
                }
                query.clear();
                return true;
            }
        }
        query.clear();
        qFatal( "Can't Open database" );
        return false;
    }
//************************************************************//

ここに私のメインがあります:

int main()
{
    DatabaseManager *mydbmanager = new DatabaseManager();
    bool b = mydbmanager-> select_all_records();  //returns false and "No query Unable to fetch row"
}
4

0 に答える 0