lundi 29 février 2016

Create sqlite table is not work when not declare in main method.

I have a method that make a connection to SQLITE and work with database by conditions (insert data or create table in my database.)

I have a big problem with my method. I tested it after not working in another project and it was worked. the difference between this program and that, is just main method. This program is in single method out of Main method and the other(worked) is in Main method, But I need it in single out of main method to call it.

When I call it in my code, at first open database correctly but can not create tables. Mean that query does not show error but not execute. Because when I typed select * from Personel .

the SQLite said No such table

this is my method :

void SQL(string cmnd)
{

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//not dbConnection
    QString path = "DBAbsent";
    db.setDatabaseName(path);
    QSqlQuery q(db);

    if(!db.open())
    {

        printf("Error to open database");
    }
    else
    {

        if (cmnd=="createTable")
        {
            q.prepare("create table IF NOT EXISTS Personel (P_id int primary key, "
                                 "CardID varchar(50), "
                               "name varchar(50));");

            if(!q.exec())
                qDebug()<<strerror(errno);

            q.prepare("create table IF NOT EXISTS Absent "
                                 "(P_id int , "
                                 "DateTime varchar(50), "
                                 "key1 int,key2 int,key3 int,key4 int);");
            if(!q.exec())
                qDebug()<<strerror(errno);

             db.close();
             return;

        }
        else if (cmnd=="Register")
        {
            string card=ReadFromCard();
            printf("\nCard Accepted : %s\nEnter Your name: ",card.c_str());
            string name;
            int id;
            //string dt=QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
            cin>>name;
            printf("\n Name Accepted.\nEnter Your Personel ID: ");
            cin>>id;
            q.prepare( "SELECT count(P_id) FROM Personel WHERE P_id =?;" );
            q.bindValue(0,id);

            if( !q.exec() )
            {
              printf("\nThe error occured from P_ID database");
              qDebug()<<strerror(errno);
              //ShowMainMenu();
              //return;
            }

            // Note: if you don't return in case of an error, put this into the else{} part
            while( q.next() )
            {
                if (q.value(0).toInt()>0)
                {
                    printf("\nThis personel ID was repeated\n");
                    break;
                }
                else
                {
                    q.prepare("SELECT CardID FROM Personel WHERE CardID =?;");
                    q.bindValue(0,card.c_str());
                    q.exec();

                    while(q.next())
                    {
                        printf("\nThis card is not valid : it was repeated\n");
                        break;
                    }
                }
            }

            q.prepare("insert into Personel value(?,?,?);");
            q.bindValue(0,id);
            q.bindValue(1,card.c_str());
            q.bindValue(2,name.c_str());
            q.exec();
            printf("\nInsert Personel complete\n");
            db.close();
            return;

        }
        else
        {
            string card;
            card=cmnd;
            QString dt=QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");

            q.prepare("SELECT P_id FROM Personel WHERE CardID =?;");
            q.bindValue(0,card.c_str());

            if( !q.exec() )
            {
              printf("\nThe error occured from database418\n");
              ShowMainMenu();

            }
            string result=("\n    CARD NOT VALID =>repeated     %s\n");
            // Note: if you don't return in case of an error, put this into the else{} part
            while( q.next() )
            {
                int P_id = q.value(0).toInt();
                q.prepare("insert into Absent(P_id,DateTime,key1,key2,key3,key4) value(?,?,1,0,0,0);");
                q.bindValue(0,P_id);
                q.bindValue(1,dt);
                q.exec();
                result=("\n********WELL COME **********%s\n");
            }
            printf("%s",result);
            db.close();
            return;
        }

    }
}  

And this is my output :

    0 - Press 0 to Back
    1 - Press 1 to Register the card
    1
    //the below lines when I want to select something from both tables , occurred
    No such file or directory
    No such file or directory  
    //the below line is when the if(cmnd="Register") {..} block is running , occurred.
    QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

Aucun commentaire:

Enregistrer un commentaire