Qt封装Sql类,便捷进行sql的增删改查操作,附源码

前言

前阵子有个项目要运用数据库,就写了个类进行便捷操作,由于运用Sqlserver,代码就以连接SqlServer为例。
废话不多上代码。

正文

#ifndef SQLSEVER_H
#define SQLSEVER_H

#include <QObject>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QDebug>

class SqlSever
{
public:
    SqlSever();

    static SqlSever *Instance();

    /*******************************************
     * 设置连接数据库相关信息
     * 输入值:
     *          strDatabasName 数据库名称
     *          strUserName 用户名
     *          strPassWord 密码
     *          strHostName 服务器名称 本地使用localhost 或者 本机IP地址 联网情况下也可以使用127.0.0.1
     * 返回值:  无
     *
     * *****************************************/
    void SetDatabaseInfo(QString strDatabaseName, QString strUserName, QString strPassWord, QString strHostName="localhost");

    /*******************************************
     * 连接数据库
     * 建立数据库连接
     * 输入值:  无
     * 返回值:  无
     *
     * *****************************************/
    bool ConnectDatabase();

    /*******************************************
     * 断开数据库连接
     * 输入值:  无
     * 返回值:  无
     *
     *****************************************/
    void CloseDatabase();

    /*******************************************
     * 执行Sql语句
     * 输入值:
     *       strSql 需要执行的语句 主要包括 增 删 改 操作
     * 返回值:返回执行是否成功
     *****************************************/
    bool ExecuteSql(QString strSql);
    bool ExecuteSql(QSqlQuery query);

    /*******************************************
     * 执行Sql语句
     * 输入值:
     *         VariantlistResult 存储查询的结果
     *         strSql  需要执行的语句 查询操作
     *         iColumn 查询语句返回的列数
     *
     * 返回值: 返回查询是否成功
     *****************************************/
    bool SelectDate(QList<QVariantList> &VariantlistResult,QString strSql,int iColumn);//查询数据

private:
    QSqlDatabase m_db;

    QString m_strDatabaseName; //数据库名称
    QString m_strUserName;    //用户名
    QString m_strPassWord;    //密码
    QString m_strHostName;    //服务器名称

    static SqlSever *m_instance;
};

#endif // SQLSEVER_H


下面是.cpp
#include "sqlsever.h"

SqlSever * SqlSever::m_instance = NULL;

SqlSever::SqlSever()
{

}

SqlSever *SqlSever::Instance()
{
    if(m_instance == NULL)
    {
        m_instance = new SqlSever();
        return m_instance;
    }
    else
    {
        return m_instance;
    }
}

void SqlSever::SetDatabaseInfo(QString strDatabaseName, QString strUserName, QString strPassWord, QString strHostName)
{
    m_strDatabaseName = strDatabaseName;
    m_strUserName = strUserName;
    m_strPassWord = strPassWord;
    m_strHostName = strHostName;
}

bool SqlSever::ConnectDatabase()
{
    m_db=QSqlDatabase::addDatabase("QODBC");
    m_db.setDatabaseName(QString("DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4;" ).arg(m_strHostName)
                                                                                             .arg(m_strDatabaseName)
                                                                                             .arg(m_strUserName)
                                                                                             .arg(m_strPassWord));
    bool isConnectOK = m_db.open();
    if(!isConnectOK)
    {
        qDebug()<<"Failed to connect";
    }
    else
    {
        qDebug()<<"successed to connect";
    }

    return isConnectOK;

}

void SqlSever::CloseDatabase()
{
    m_db.close();
}

bool SqlSever::ExecuteSql(QString strSql)
{
    if(!m_db.isOpen())
    {
        ConnectDatabase();
        if(!m_db.isOpen())
        {
            qDebug()<<"Failed to connect to root Sql admin";
            return false;
        }
        else
        {
            qDebug()<<"successed to connect";
        }
    }
    QSqlQuery query;
    query.prepare(strSql);
    bool bExecute = query.exec();
    return bExecute;
}

bool SqlSever::ExecuteSql(QSqlQuery query)
{
    if(!m_db.isOpen())
    {
        ConnectDatabase();
        if(!m_db.isOpen())
        {
            qDebug()<<"Failed to connect to root Sql admin";
            return false;
        }
        else
        {
            qDebug()<<"successed to connect";
        }
    }
    bool bExecute = query.exec();
    return bExecute;
}

bool SqlSever::SelectDate(QList<QVariantList> &VariantlistResult, QString strSql, int iColumn)
{
    if(!m_db.isOpen())
    {
        ConnectDatabase();
        if(!m_db.isOpen())
        {
            qDebug()<<"Failed to connect to root Sql admin";
            return false;
        }
        else
        {
            qDebug()<<"successed to connect";
        }
    }

    QSqlQuery query;
    query.prepare(strSql);
    bool flag = query.exec();

    QVariantList Variantlist;
    while(query.next())
    {
        for(int i= 0; i < iColumn; i++)
        {
           QVariant value  = query.value(i);
           Variantlist.append(value);
        }
      VariantlistResult.push_back(Variantlist);
      Variantlist.clear();
    }
    return flag;
}

然后运用时我是直接读的ini文件进行数据库连接
   QString strIniPath = QApplication::applicationDirPath();
    strIniPath += "/";
    strIniPath += "config.ini";

    ManagerIniFile info(strIniPath);

    //获取config.ini中数据库连接信息
    QString strHostName     = info.ReadSetting("SQL2008", "HostName");
    QString strDatabaseName = info.ReadSetting("SQL2008", "DatabaseName");
    QString strUserName     = info.ReadSetting("SQL2008", "UserName");
    QString strPassword     = info.ReadSetting("SQL2008", "Password");

    SqlSever *pSqlServer = SqlSever::Instance();
    pSqlServer->SetDatabaseInfo(strDatabaseName, strUserName, strPassword, strHostName);

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
m_pDbProcPic = new CDBProcess("sqlserver"); m_pDbProc->openDB("mysvr", "mydb", "myusername", "mypwd"); m_pDbProcPic = new CDBProcess("mysql"); m_pDbProc->openDB("localhost", "mydb", "root", "password"); m_pDbProcPic = new CDBProcess("access"); m_pDbProc->openDB("", strMDB, "sa", "password"); m_pDbProcPic = new CDBProcess("sqlite"); m_pDbProcPic->openDB("", "mysqlitedb"); CDBProcess使用说明 构造函数: CDBProcess(const QString strType); 参数:为数据库型,不区分大小写,支持的型有 sqlite mysql access sqlserver 例: CDBProcess db("sqlite"); -------------------------------------------------- 打开数据库 bool openDB(const QString strSvrName, //服务器名 const QString strDBname, //数据库名 const QString strUserID="", //用户名 const QString strUserPwd=""); //密码 打开数据库成功,返回true,否则返回false 对于sqlite,只有strDBname有效,其它参数忽略,如db.openDB("", "mysqlite.db") 对于MS Access数据库,strSvrName为空,用户名默认为"sa",如db.openDB("", "myaccess.mdb"); 对MSAccess数据库,也可通过一个UDL文件,打开,如db.openDB("my.udl", ""); mysqlsqlserver,就是各个参数依次提供,如db.openDB("svr1", "mydb", "user1", "abcd"); ----------------------------------------------------- 关闭数据库,CDBProcess析构时,亦会自动关闭数据库 void closeDB(); //db.closeDB(); ------------------------------------------------------ 执行Sql语句 bool excuteSQL(const QString); ------------------------------------------------------- 打开记录集 bool openRecordsetBySql(const QString strSql, //Sql语句 int idx = -1); //记录集id,用于标识记录集,默认值为-1 例: db.openRecordsetBySql("SELECT * FROM TB1", 5); 打开一个记录集,标识号为5,后面操作这个记录集,也要提供这个标识号 -------------------------------------------------------- 关闭记录集 void closeRecordset(int idx = -1); 例: db.closeRecordset(5); 关闭之前打开的标识为5的记录集 ----------------------------------- 数据库是否处在打开状态 bool isOpen() const; ------------------------------------ 记录集游标是否在结尾,参数为记录集标识 bool recEOF(int idx = -1) const; 例:bool b = db.RecBOF(5); ------------------------------------ 记录集游标是否在第一条记录之前,参数为记录集标识 bool recBOF(int idx = -1) const; ---------------------------------------- 删除一个表 bool dropTable(const QString); --------------------------------------------- 读取标识为idx记录集的当前记录的各字段值,方法如示例: bool getFieldsValueFromRec(int idx, const char* szFldInfo, ...) const; int iSN; QString strName; double dHeight; QDateTime dt; QByteArray ba; db.getFieldsValueFromRec(5, //记录集id "sn%d", &iSN, //字段名加型 sn为字段名%d表示整型,&iSN传入指针,保存返回字段值 "name%s", &strName, //字段名加型 name为字段名%s表示字符串(QString) "height&f", &dHeight, //字段名加型 height为字段名%f表示小数(double) "birthday%t", &dt, //字段名加型 birthday为字段名%t表示时间(QDateTime) "photo%b", &ba, //字段名加型 photo为字段名%b表示二进制流(QByteArray) CDBProcess::szEnd); //结束标志,"|" 执行后,各字段值就保存在iSN, strName等变量中了。 参数:第一个参数为记录集id 后面可变参数,字段%型标识,用于保存返回值的指针, 型标识:%d-int %s-QString %f-double %t-QDateTime %b-QByteArray --------------------------------------------------------------------------- 向一个数据表中填加一条记录 bool addFieldsValueToTbl(const QString strTbl, const char* szFldInfo, ...); 参数:第一个参数strTbl,为表名 后面是可变参数,为"字段%型标识",值(或指针),注int,double型直接传值,其它传指针 例: db.addFieldsValueToTbl("TB1", //表名 "sn%d", iSN, //字段名加型 sn为字段名%d表示整型,iSN传入值 "name%s", &strName, //字段名加型 name为字段名%s表示字符串(QString), 传入QString变量指针 "height&f", dHeight, //字段名加型 height为字段名%f表示小数(double),dHeight传入值 "birthday%t", &dt, //字段名加型 birthday为字段名%t表示时间(QDateTime),传入指针 "photo%b", &ba, //字段名加型 photo为字段名%b表示二进制流(QByteArray),传入指针 CDBProcess::szEnd); //结束标志,"|" ----------------------------------------------------------- 修改表中符合WHERE子句条件的记录 bool updateTblFieldsValue(const QString strTbl, QString strWhere, const char * szFldInfo, ... ); strTbl表名 strWhere SQL WHERE子句,如"WHERE sn=20" const char * szFldInfo, ...可变参数,同addFieldsValueToTbl 例: db.updateTblFieldsValue("TB1", "WHERE sn=20", "height&f", dHeight, "photo%b", &ba, CDBProcess::szEnd); ---------------------------------------------------------------- 以下几个函数分别是获取记录数,和记录光标移动。参数为记录集标识 long getRecordCount(int idx = -1) const; bool moveFirst(int idx = -1) const; bool movePrevious(int idx = -1) const; bool moveNext(int idx = -1) const; bool moveLast(int idx = -1) const; bool moveTo(int n, int idx = -1) const; -------------------------------------------------------------------- 返回数据库名 QString getDbName() const; ------------------------ 以下几个函数未验证 bool execStoreProcOfArgList(int idx, const QString strStoreProc, const char* szFldsInfo, ...); bool exexProc(const QString strStoreProc, QString str1, QString& str2); bool transaction(); bool commit(); bool rollback();
好的,我可以为您提供一个简单的基于 Qt封装 XML 操作的示例代码,实现节点的增删改查和初始化等功能。 首先,我们需要在头文件中引入 Qt 的相关库和命名空间: ```cpp #include <QtCore/QFile> #include <QtCore/QXmlStreamReader> #include <QtCore/QXmlStreamWriter> #include <QtCore/QDebug> #include <QtCore/QList> #include <QtCore/QString> #include <QtCore/QXmlStreamAttributes> #include <QtCore/QXmlStreamNamespaceDeclarations> ``` 然后,我们定义一个封装 XML 操作,包括节点的增删改查和初始化等功能。以下是一个简单的示例: ```cpp class XmlManager { public: XmlManager(const QString &fileName); virtual ~XmlManager(); void initXmlDocument(); void readXmlDocument(); void writeXmlDocument(); void addNode(const QString &parentNodeName, const QString &nodeName, const QString &nodeValue); void removeNode(const QString &nodeName); void updateNode(const QString &nodeName, const QString &newValue); QString getNodeValue(const QString &nodeName); private: QFile m_file; QXmlStreamReader m_reader; QXmlStreamWriter m_writer; QString m_fileName; }; ``` 在的构造函数中,我们需要打开 XML 文件,并初始化 `QXmlStreamReader` 和 `QXmlStreamWriter` 以进行读写操作: ```cpp XmlManager::XmlManager(const QString &fileName) : m_fileName(fileName) { m_file.setFileName(m_fileName); if (!m_file.open(QIODevice::ReadWrite | QIODevice::Text)) { qDebug() << "Failed to open file " << m_fileName; } m_reader.setDevice(&m_file); m_writer.setDevice(&m_file); } ``` 在的析构函数中,我们需要关闭文件: ```cpp XmlManager::~XmlManager() { m_file.close(); } ``` 接下来,我们实现中的各个方法。首先是 `initXmlDocument()` 方法,该方法用于初始化一个空的 XML 文档: ```cpp void XmlManager::initXmlDocument() { m_writer.setAutoFormatting(true); m_writer.writeStartDocument(); m_writer.writeEndDocument(); } ``` 然后是 `readXmlDocument()` 方法,用于读取 XML 文档的所有节点: ```cpp void XmlManager::readXmlDocument() { while (!m_reader.atEnd() && !m_reader.hasError()) { QXmlStreamReader::TokenType token = m_reader.readNext(); if (token == QXmlStreamReader::StartDocument) { continue; } if (token == QXmlStreamReader::StartElement) { QString name = m_reader.name().toString(); QString value = m_reader.readElementText(); qDebug() << name << ":" << value; } } } ``` `writeXmlDocument()` 方法用于将更改后的 XML 文档写回文件: ```cpp void XmlManager::writeXmlDocument() { m_file.resize(0); m_writer.writeEndDocument(); } ``` `addNode()` 方法用于在指定的父节点下添加一个新的子节点: ```cpp void XmlManager::addNode(const QString &parentNodeName, const QString &nodeName, const QString &nodeValue) { m_reader.setDevice(&m_file); m_writer.setDevice(&m_file); while (!m_reader.atEnd() && !m_reader.hasError()) { QXmlStreamReader::TokenType token = m_reader.readNext(); if (token == QXmlStreamReader::StartElement) { QString name = m_reader.name().toString(); if (name == parentNodeName) { m_writer.writeStartElement(nodeName); m_writer.writeCharacters(nodeValue); m_writer.writeEndElement(); } } } } ``` `removeNode()` 方法用于删除指定的节点: ```cpp void XmlManager::removeNode(const QString &nodeName) { m_reader.setDevice(&m_file); m_writer.setDevice(&m_file); while (!m_reader.atEnd() && !m_reader.hasError()) { QXmlStreamReader::TokenType token = m_reader.readNext(); if (token == QXmlStreamReader::StartElement) { QString name = m_reader.name().toString(); if (name == nodeName) { m_writer.writeEndElement(); } } } } ``` `updateNode()` 方法用于更新指定节点的值: ```cpp void XmlManager::updateNode(const QString &nodeName, const QString &newValue) { m_reader.setDevice(&m_file); m_writer.setDevice(&m_file); while (!m_reader.atEnd() && !m_reader.hasError()) { QXmlStreamReader::TokenType token = m_reader.readNext(); if (token == QXmlStreamReader::StartElement) { QString name = m_reader.name().toString(); if (name == nodeName) { m_writer.writeStartElement(nodeName); m_writer.writeCharacters(newValue); m_writer.writeEndElement(); } else { m_writer.writeStartElement(name); m_writer.writeCharacters(m_reader.readElementText()); m_writer.writeEndElement(); } } } } ``` 最后是 `getNodeValue()` 方法,用于获取指定节点的值: ```cpp QString XmlManager::getNodeValue(const QString &nodeName) { m_reader.setDevice(&m_file); while (!m_reader.atEnd() && !m_reader.hasError()) { QXmlStreamReader::TokenType token = m_reader.readNext(); if (token == QXmlStreamReader::StartElement) { QString name = m_reader.name().toString(); if (name == nodeName) { return m_reader.readElementText(); } } } return ""; } ``` 以上是一个简单的基于 Qt封装 XML 操作的示例代码。您可以按照您的需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值