QSqlQuery::prepare: database not open



  • Hey, I started SQL today and I was wondering why it says db isn't open. Note: I had trouble with another error saying the driver wasn't found or something and I added a bunch of files to system PATH. Here is my code.

    void w::database(){
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("Host");
        db.setDatabaseName("Name");         /* In my real code, I set the real
        db.setUserName("Username");               stuff here */
        db.setPassword("Password");
    
        if (db.open())                                             
        {                                                                        
            QMessageBox msgBox;                         
            msgBox.setText("DB OPENED");          
            msgBox.exec();
    
        }
    
    
        QSqlQuery query(db);
        query.prepare("INSERT INTO person (Username, Password, summ, Email) "  
                          "VALUES (:user, :pass, :summ, :mail)");
        query.bindValue(":user", Username);          // I do have variables set earlier
        query.bindValue(":pass", Password);
        query.bindValue(":summ", summ);
        query.bindValue(":mail", Email);
        query.exec();
    
    }
    

    For some reasons, when I press the button (which launch this method) if I have the db.open part, It "doesn't respond". Help anyone... I searched on internet but didn't find anything that solved my problem...
    Thanks



  • Hi,

    Are you possibly missing a call to setPort() ?

    Example:

    db.setPort(3306);
    

  • Moderators

    @RekTek249 said in QSqlQuery::prepare: database not open:

    "doesn't respond"

    is the host reachable? Did you try to connect to the server using MySQL client?



  • @mawh1960 I didn't know you had to set port... where to you know the port ? is 3306 the default one ?



  • @jsulm It works with phpmyadmin... It doesn't respond for like 30sec and then if I wait it sends the "database not open"message in the output


  • Lifetime Qt Champion

    Hi,

    Are you running phpmyadmin on the same machine as the MySQL server ?

    Are you running your application on the same machine as the server ?

    If no to the second question, then did you correctly configure your MySQL server to accept external connections ? And also don't forget to secure them.



  • @SGaist I'm hosting the sql server on a website. It's a hosting website so I guess it's a linux server ? I'm running phpmyadmin on my windows 10 computer.


  • Lifetime Qt Champion

    Then check that you are correctly using the same user name, password as you are using in PHPMyAdmin.



  • @SGaist It is the correct one i checked that before asking it here...


  • Lifetime Qt Champion

    What exact error message do you get from your QSqlDatabase object ?



  • @RekTek249

        QSqlQuery query(db);
        query.prepare("INSERT INTO person (Username, Password, summ, Email) "  
                          "VALUES (:user, :pass, :summ, :mail)");
        query.bindValue(":user", Username);          // I do have variables set earlier
        query.bindValue(":pass", Password);
        query.bindValue(":summ", summ);
        query.bindValue(":mail", Email);
        query.exec();
    

    The mistake is not giving you anything error?

    please #include "QSqlError" and

     if (db.open())                                             
        {                                                                        
            QMessageBox msgBox;                         
            msgBox.setText("DB OPENED");          
            msgBox.exec();
    
        }
    else{
           qDebug() << db.lastError()
     }
    

    By doing so we can understand what the problem is about anyway...



  • @Taz742 QSqlError("2003", "QMYSQL: Unable to connect", "Can't connect to MySQL server on 'adress.here' (10060)")
    Is the error...


  • Lifetime Qt Champion

    Did you check that the user you are using to connect to the database can be used for remote connections ?



  • @SGaist It can.... What is the "2003" and 10060 meaning ? is 2003 the port ?



  • I tried it on another server and it gives the following error..

    QSqlError("2005", "QMYSQL: Unable to connect", "Unknown MySQL server host 'mysql.hostinger.fr' (0)")
    QSqlQuery::prepare: database not open
    


  • @RekTek249
    Again: are you sure you are allowed to establish a remote connection to the database?

    • check user permission
    • check if port is correct
    • check if port is reachable from remote


  • @RekTek249 said in QSqlQuery::prepare: database not open:

    It can.... What is the "2003" and 10060 meaning ? is 2003 the port ?

    2003 is not a port name, so let's say the title of the problem.



  • @Taz742
    It's not a "title", just an qt internal error number. Same with the other code that is a mysql internal error code


  • Lifetime Qt Champion

    To add to @the_ : the error state that mysql.hostinger.fr is an unknown host. Looks like you are giving the wrong address.



  • @SGaist When I go to the "remote mysql" part of the site, it gives an access host... do i gotta use this as the hostname ?



  • @RekTek249 If that's what i do, it gives that error:

    QSqlError("1045", "QMYSQL: Unable to connect", "Access denied for user 'rektek_write'@'*ip here*.' (using password: YES)")
    

    If it's a permission problem, what do I need to do ? I have the insert one because that's the only thing I need to do...


  • Lifetime Qt Champion

    Is this user authorised to access the database from outside that machine ?



  • @SGaist Well it's a website host.... They wouldn't allow you to create hosts that can only connect on that machine i guess.


  • Lifetime Qt Champion

    That I don't know, you should ask them.



  • @SGaist Alright... I checked something and apparently for remote you need the user's ip. The control panel needs the ip so I guess I can't make this application public because they wont be able to access the database ?


  • Lifetime Qt Champion

    Then implement a REST service to expose what you need for your application.

    What exactly are you trying to implement ? Because currently it seems you are trying to do server-side stuff from your application.



  • @SGaist I just need to store (INSERT) things in a database... And what is a REST ?




  • Moderators

    @RekTek249 Yes, you should implement a REST interface - exposing a SQL database to the public internet isn't a good idea.


  • Lifetime Qt Champion

    To add to @the_, the tutorial explains thing nicely but there are more lightweight options than a full Java + eclipse + tomcat setup to get started.

    Python wise there's the Django REST framework or Flask RESTful

    PHP wise there's PHP Slim

    There are also other options but you'd have to first share what you have available on your server.


Log in to reply