2017-03-08 215 views
1

我无法使用我的qt应用程序连接到我的sqlite数据库。 我有一个辅助类DBManager,应该有打开和关闭数据库的功能,因为我想重复使用多个地方的代码。 这里是dbmanager.cpp使用qt连接到SQLite数据库

DBManager::DBManager() 
{ 

} 
void DBManager::connOpen() 
{ 

    path = QCoreApplication::applicationDirPath() + "/GameSuitedb.db"; 
    mydb=QSqlDatabase::addDatabase("QSQLITE"); 
    mydb.setDatabaseName(path); 

void DBManager::connClose() /*Closes connection and commits changes to database*/ 
{ 
    mydb.close(); 
    mydb.removeDatabase(QSqlDatabase::defaultConnection); 
} 

注意我的数据库名为GameSuitedb和毗邻的可执行 而这里就是我试图访问我的数据库:

void CreateUser::on_pushButton_submit_clicked() 
{ 
    dbmanager.connOpen(); 
    QString username = ui->lineEdit_username->text(); 
    QString password = ui->lineEdit_password->text(); //Gets password text 
    QSqlQuery qry(dbmanager.mydb); 
    qry.prepare("INSERT INTO users (username,password) VALUES ('"+username+"', '"+password+"')"); 

    if(qry.exec()){ 
    } 
    else{ 
     ui->statusbar->showMessage(qry.lastError().text()); 
    } 
     dbmanager.connClose(); 
} 

的错误上面的代码在启动时给了我QSqlQuery :: prepare:数据库未打开。

+0

您是否在调试器中验证了路径变量是您认为的?另外,请阅读如何使用准备好的查询 - 您当前的代码包含SQL注入攻击的明显机会。 – MrEricSir

+0

如果数据库文件不存在于文件夹中,qt中的sqlite支持至少会尝试创建一个新的数据库。 – drescherjm

回答

4

错误代码告诉你数据库没有打开,因为你的DBManager::connOpen()函数似乎在做除了实际打开数据库之外的任何事情,这与它的命名方式相反。

您需要在DBManager::connOpen()函数末尾调用QSqlDatabase::open(),以便数据库被打开并准备好使用。

void DBManager::connOpen() 
{ 
    path = QCoreApplication::applicationDirPath() + "/GameSuitedb.db"; 
    mydb=QSqlDatabase::addDatabase("QSQLITE"); 
    mydb.setDatabaseName(path); 
    if(!mydb.open()) 
    { 
     //use lastError() here to figure out what went wrong. 
    } 
} 
+0

这有帮助,谢谢! –