• 7449阅读
  • 7回复

新手提问,关于QT 数据库连接的使用问题?? [复制链接]

上一主题 下一主题
离线qkwqkw
 

只看楼主 倒序阅读 楼主  发表于: 2010-08-06
请问下大家,我在程序的main函数中建立了sqlite数据库的数据库连接,并设了连接名。
我要在其它窗体中如果要使用数据库的话,是不是直接使用database(“连接名”)就可以了?
但是使用后要不要关闭和删除连接呢,?
因为我在其它窗体中都要访问数据库,如果都申请了连接,而没有释放的话,会不会出现问题呢??
这方面不是太懂,请高人指点一下??
谢谢。。~~
离线XChinux

只看该作者 1楼 发表于: 2010-08-06
对于一般的应用来说,同一个连接,在其他地方都使用就行了。为方便使用而言,建议使用默认连接名。这样正程序中的其它地方只要
QSqlQuey q;
q.exec(....)就能用了。

当然了,在main()函数中,最后退出前,要关闭数据库,并删除连接(QSqlDatabase::removeDatabase(....))
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线qkwqkw

只看该作者 2楼 发表于: 2010-08-07
呵呵,先谢谢XChinux 。
我还想问一下,使用默认的连接名和自己指定一个连接名有什么区吗?我感觉好像区别不大呀??
如果我在main中指定了连接名,就像我上面所说的,我在使用时使用database("连接名")得到一个连接,那我该如何管理我得到的连接呢?
比如在Main中这样写的:
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","test");
db.setDatabaseName("test.db");
.......................
}
在其它访问数据库的地方我这样写的:

QSqlDatabase db = QSqlDatabase::database("test");
QSqlQuery query(db);
query.exec("...........");
........................
query.clear(); <------ 请问加上这两句应该是对的吧?
query.finish();

那么我在上面得到的一个连接db,在这个位置是不是要关闭或删除呢?我在代码中加入:db.close();也没出什么错误,请问这样对吗?

}

呵呵,不是太明白!!
离线XChinux

只看该作者 3楼 发表于: 2010-08-07
使用默认连接名,在使用QSqlQuery时不需要指定某个QSqlDatabase对象的,很省事。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线qkwqkw

只看该作者 4楼 发表于: 2010-08-07
呵呵,嗯,谢谢答复!!
我的问题太多了,还有一个问题!
数据库连接删除代码应该放在main函数退出时吧!但是具体放在哪呀??老是出错!!我把代码贴出来。感觉是不是放在主窗体退出函数里更好??
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    bool create=QFile::exists("test.db");
    if (!createConnection())
        return 1;

    if (!create)
        createData();

    //主窗体显示    
    MainWindow w;   //主窗体中有几个页面,在页面里要访问数据库。
       w.show();

    //登录开始。
    login log;

    if(log.exec()== QDialog::Accepted)
    {
        w.setUser(log.currentUserRight(),log.currentUserName()); //这个是权限和用户名设置。
        return app.exec();  //在这???
    }
    else
    {
        return 0;
    }
}
离线XChinux

只看该作者 5楼 发表于: 2010-08-09
给楼主一段示例代码,里面的内容不严谨,但足够展示在主函数中处理数据库连接、删除的问题了:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QTextCodec *codec = QTextCodec::codecForName("GBK");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    QApplication::setStyle("Cleanlooks");

    {
        QString strStyleSheet;
        QFile file(":/etc/default_base.qss");
        if (file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            strStyleSheet += QString::fromUtf8(file.readAll().data());
            file.close();
        }
        app.setStyleSheet(strStyleSheet);
    }

    QTranslator translator;
    translator.load(":/qt/trans/qt_zh_CN.qm");
    app.installTranslator(&translator);

    QSettings *settings = new QSettings(QApplication::applicationDirPath()
                + "/../etc/PosExpt.conf", QSettings::IniFormat);
    QSqlDatabase *db = new QSqlDatabase(QSqlDatabase::addDatabase("QODBC"));

    db->setDatabaseName(QString("DRIVER={SQL Server};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4")
            .arg(settings->value("hostname").toString())
            .arg(settings->value("database2").toString())
            .arg(settings->value("username").toString())
            .arg(settings->value("password").toString()));

    QString connName = db->connectionName();
    if (!db->open())
    {
        QMessageBox::critical(NULL, "错误信息", "连接数据库失败");
        delete settings;
        delete db;
        QSqlDatabase::removeDatabase(connName);
        app.quit();
        return EXIT_FAILURE;
    }

    ChinuxTeam::MainWindow window;
    delete settings;
    window.resize(800, 600);
    window.showMaximized();
    int iRet = app.exec();
    db->close();
    delete db;
    QSqlDatabase::removeDatabase(connName);
    return iRet;
}
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线qkwqkw

只看该作者 6楼 发表于: 2010-08-10
呵呵,好人呀,非常感谢!
我以为沉下了!
离线guomeng0905
只看该作者 7楼 发表于: 2012-03-08
学习了!
快速回复
限100 字节
 
上一个 下一个