• 11740阅读
  • 7回复

QSqlQuery::exec: database not open [复制链接]

上一主题 下一主题
离线luckyyoung
 

只看楼主 倒序阅读 楼主  发表于: 2012-04-07
  1. QSqlQuery conAccessDB::excuteSQL(QString sqlcmd){
  2. if(!db.open()){
  3. qDebug() << "Database Error: " << db.lastError().text();
  4. return QSqlQuery();
  5. }
  6. if(!query.exec(sqlcmd)){
  7. qDebug() << "Database Error: When excute \"" << sqlcmd << "\"";
  8. db.close();
  9. return QSqlQuery();
  10. }
  11. db.close();
  12. return query;
  13. }
我是在打开了数据之后才执行的query.exec(sqlcmd),为何还会出现数据库没打开(QSqlQuery::exec: database not open)的提示?我该怎么做?
Anything is possible!
离线淳于半邪

只看该作者 1楼 发表于: 2012-04-10
给全代码,是不是前面建库的时候出现了问题
离线luckyyoung

只看该作者 2楼 发表于: 2012-04-10
引用第1楼淳于半邪于2012-04-10 18:17发表的  :
给全代码,是不是前面建库的时候出现了问题

//connectAccessDB.pro
QT       += core
QT       += sql
QT       -= gui
TARGET = connectAccessDB
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \    conAccessDB.cpp
HEADERS += \    conAccessDB.h


//conAccessDB.h
#ifndef CONACCESSDB_H
#define CONACCESSDB_H
#include<QString>
#include<QtSql/QtSql>
#include<QDebug>
class conAccessDB{
public:    conAccessDB();
    conAccessDB(QString path, QString username="", QString password="");
    //set function
    void setDatabasePath(QString path);
    void setUsername(QString username);
    void setPassword(QString password);
    QSqlQuery excuteSQL(QString sqlcmd);
private:
    QSqlDatabase db;
    QSqlQuery query;
    QString path;
    QString username;
    QString password;
};
#endif // CONACCESSDB_H


//conAccessDB.cpp
#include "conAccessDB.h"
conAccessDB::conAccessDB(){
    db = QSqlDatabase::addDatabase("QODBC","MYACCESS");
}
conAccessDB::conAccessDB(QString path, QString username, QString password)
{
    this->path = path;
    this->username = username;
    this->password = password;
    db = QSqlDatabase::addDatabase("QODBC");
    QString dbName = "DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ="+path;    db.setDatabaseName(dbName);
    db.setUserName(username);
    db.setPassword(password);
    if(!db.open()){
        qDebug() << "Database Error" << db.lastError().text();
        return;
    }
    db.close();
}
void conAccessDB::setUsername(QString username){
    this->username=username;
}
void conAccessDB::setPassword(QString password){
    this->password = password;
}
void conAccessDB::setDatabasePath(QString path){
    this->path = path;
}
QSqlQuery conAccessDB::excuteSQL(QString sqlcmd){
    if(!db.open()){
        qDebug() << "Database Error: " << db.lastError().text();
        return QSqlQuery();
    }
    if(!query.exec(sqlcmd)){
        qDebug() << "Database Error: When excute \"" << sqlcmd << "\"";
        db.close();
        return QSqlQuery();
    }
    db.close();
    return query;
}


//main.cpp
#include <QtCore/QCoreApplication>
#include "conAccessDB.h"
#include <QTextStream>
int main(int argc, char *argv[]){
    QCoreApplication a(argc, argv);
    conAccessDB db("D:/Qtprogram/connectAccessDB-build-desktop/safeSystem.mdb");
    QSqlQuery query=db.excuteSQL("select * from basicInfo");
    while(query.next()){
        if(!query.isActive()){
            qDebug() << "Database Error: " << query.lastError().text();
            return 1;
        }
        else{
            for(int i=0;i<query.record().count();i++){
                qDebug() << "Record column " << i+1 << query.value(i).toString();
            }
        }
    }
    return a.exec();
}
Anything is possible!
离线luckyyoung

只看该作者 3楼 发表于: 2012-04-10
引用第1楼淳于半邪于2012-04-10 18:17发表的  :
给全代码,是不是前面建库的时候出现了问题

数据库是已经建好的,在其他编程语言中正确打开并使用。
Anything is possible!
离线luckyyoung

只看该作者 4楼 发表于: 2012-04-10
引用第1楼淳于半邪于2012-04-10 18:17发表的  :
给全代码,是不是前面建库的时候出现了问题


感觉和书里的代码差不多,只不过写在了类里。连接数据库的时候,没有任何报错。query时就报错了。求教!
Anything is possible!
离线ywchen2000

只看该作者 5楼 发表于: 2012-06-05
数据库的路径对么??
ipanforlinux 金山快盘LINUX版本
qnotepad  一个功能强大的文本编辑器
欢迎访问http://www.ipanx.net
离线XChinux

只看该作者 6楼 发表于: 2012-06-06
你的QSqlQuery成员变量query构造时没有指定QSqlDatabase对象,并且数据库连接成功后也没有指定setDatabase(),这样的话, 这个query一直使用的是默认连接,而你的addDatabase()第二个参数指定的是myaccess连接,问题就在这里,解决方法:
或者addDatabse()时第二个参数不填
或者调用query.setDatabase(db)
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线btptboy

只看该作者 7楼 发表于: 2012-06-21
总版主正解,QSqlQuery一定要传QSqlDatabase参数
我思故我在
快速回复
限100 字节
 
上一个 下一个