Qt开发,将数据库封装

开发环境vs2010+Qt4.8.6
项目目录树:
SourceFiles:
- main.cpp
- UserSqlClass.h
- UserSqlClass.cpp

SQL:
- sql_interface.h
- sql_interface.cpp

main.cpp

#include <QtGui/QApplication>
#include <QtCore>
#include <QtSql>

int main(int argc,char *argv[])
{
    QApplication a(argc,argv);
    UserSqlClass w;
    w.show();
    return a.exec();
}

数据库类SqlClass的声明形式:
sql_interface.h

class SqlClass : publc QObject
{
    Q_OBJECT
private:
    QSqlDatabase* db;
public:
        SqlClass(QObject* parent = 0);
    virtual ~SqlClass();
public:
    bool OpenDatabase();
};

类SqlClass的实现
sql_interface.cpp

SqlClass::SqlClass(QObject* parent):QObject(parent)
{
}

bool SqlClass::OpenDatabase()
{
    db = &QSqlDatabase::addDatabase("QODBC","xxxx");
    if(!db->isValid())
    {
        qDebug() << db->lastError().text();
        return false;
    }

    db->setHostName("xxx,xx,xx,xx");
    db->setDatabaseName("DRIVER={SQL SERVER};SERVER=xx.xx.xx.xx;DATABASE=xxx");
    db->setUserName("xxx");
    db->setPassword("123456"):

    if( !db->open() )
    {
        QMessageBox::warning(NULL,"database error","Cannot open DB",QMessageBox::Cancel);
        return false;
    }

    return true;
}

SqlClass::~SqlClass()
{
}

UserSqlClass类的声明形式。
UserSqlClass.h

class UserSqlClass : public QMainWindow
{
    Q_OBJECT
private:
    Ui::UserSqlClass ui;
    SqlClass* mainSql;

public:
    UserSqlClass(QWidget *parent=0,Qt::WFlags flags = 0);
    ~UserSqlClass();
};

UserSqlClass的构造函数:
UserSqlClass.cpp

UserSqlClass::UserSqlClass(QWidget *parent,Qt::WFlags flags) : QMainWindow(parent,flags)
{
    ui.setupUi(this);
    mainSql = new SqlClass(this);
}

UserSqlClass::~UserSqlClass()
{
}

这里很多都是比较基础的知识点,不做过多解释。
主要讲解的是SqlClass类的声明。
QObject是所有Qt类的基类,所有如果像需要用到信号槽的最好是需要继承QObject,而类SqlClass声明里的Q_OBJECT宏也是必须的。
还要注意的是SqlClass的析构函数使 虚析构函数,这样可以在释放的时候向下释放,相关知识可查虚析构函数。
原本这里的db设置是打算写成传参函数的,这样的扩展性会比较强一点,而这里主要用于做简单例子也就免去了。

还有最最总要的一点是将,QSqlDatabase db,SqlClass mainSql声明为指针,这里可保证是对同一次链接对象进行操作。面向对象的思想就是将一次链接视为一个对象,这个对象就可以执行SQL操作。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。