浅谈Qt在Sqlite中的应用

一、Sqlite简介

        SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它是一种相对较小的数据库。它的设计方向面向是嵌入式的,而且已经在很多嵌入式产品中应用了它,其占用资源非常的低,在嵌入式设备中,可能占用百kb内存。同时支持Windows/Linux/Unix等等主流的操作系统,能够跟很多程序语言相结合,比如 C++、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、等开源的世界著名数据库管理系统来讲,其处理速度比它们都快。

二、在Qt中的应用

1.Qt项目中引入sql模块

   在工程pro文件中添加Qt += sql

2.加入头文件

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QList>

3.数据库的开启与关闭

1)数据库的开启

QSqlDatabase db;QList<QString> g_tbNameList;
QStringList g_recordList;

bool openDB()
{
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("client.db");
    
    bool ok = m_db.open();
    retun ok;
}

2)数据库的关闭

void closeDB()
{
    if(db.isOpen())
        db.close();
}

4.检查数据库有多少张表以及表名

bool checkDBTableName()
{
    bool bSuccess = false;
    if(openDB())
    {
        QStringList tableList = m_db.tables();
        //表个数
        int tbCount = tableList.count();
        QString sTableName;
        foreach (sTableName, tableList) 
        {
            g_tbNameList.append(sTableName);
        }
        if(g_tbNameList.size() > 0)
        {
            bSuccess = true;
        }
    }
    closeDB();
    
    return bSuccess;
}

5.检查数据库表中字段名

void checkDBRecord(QString sDBTableName)
{
    if(openDB())
    {
        QSqlQuery query;
        QString sql = QString("select * from %1").arg(sDBTableName);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().databaseText();
        }

        if(query.numRowsAffected() != 0)
        {
            while(query.next())
            {
                for(int i = 0; i<query.record().count(); i++)
                {
                    g_recordList<<query.record().fieldName(i);
                }
            }
        }

    }
    closeDB();
}

6.检查数据表是否有记录

bool checkDBTableSpecificName(QString sDBTableName)
{
    bool bSuccess = false;
    if(openDB())
    {
        QSqlQuery query;
        QString sql = QString("select count(*) from sqlite_master where type='table' and name='%1';").arg(sDBTableName);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().databaseText();
        }

        if(query.numRowsAffected() != 0)
        {
            if(query.next())
            {
                 if(query.value(0).toInt()==0)
                {
                    // 表不存在
                    bSuccess = true;
                }else{
                    //表存在
                    bSuccess = false;
                }
            }
        }
    }
    closeDB();
    return bSuccess;
}

7.Qt提取表数据的方案

bool selectDBTableData(QString sDBTableName)
{
    bool bSuccess = false;
    if(openDB())
    {
        QSqlQuery query;
        QString sql = QString("select * from %1").arg(sDBTableName);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
        }

        if(query.numRowsAffected() != 0)
        {
            while(query.next())
            {
                //方案一:
                QString sName      = query.value(0).toString();
                int num          = query.value(1).toInt();
                double dMoneyNum = query.value(2).toDouble();
                bool    bRun     = query.value(3).toBool();
                
                //方案二:
                QString sName      = query.value("ID").toString();
                int num          = query.value("Num").toInt();
                double dMoneyNum = query.value("MoneyNum").toDouble();
                bool    bRun     = query.value("Run").toBool();
                //方案三:
                QString sName      = query.record().value(0).toString();
                int num          = query.record().value(1).toInt();
                double dMoneyNum = query.record().value(2).toDouble();
                bool    bRun     = query.record().value(3).toBool();
                //方案四:
                QString sName      = query.record().value("ID").toString();
                int num          = query.record().value("Num").toInt();
                double dMoneyNum = query.record().value("MoneyNum").toDouble();
                bool    bRun     = query.record().value("Run").toBool();
            }
        }

    }
    closeDB();
    return bSuccess;
}

8.数据表插入数据

bool insertDBTableAllRecord(QString sDBTableName, QString sName, int num, double dMoneyNum, bool bRun)
{
    bool bSuccess = false;
    if(openDB())
    {
        //方案一:
        QSqlQuery query;
        QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values('%2', %3, %4, %5)").arg(sDBTableName).arg(sName).arg(num).arg(dMoneyNum).arg(bRun);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
        }
        else
        {
            bSuccess = true;
        }
        //方案二:
        QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values (:Name, :num, :MoneyNum, :Run)").arg(sDBTableName);
        QSqlQuery query;
        query.prepare(sql);
        query.bindValue(":Name", "Tom");
        query.bindValue(":Num", 25);
        query.bindValue(":MoneyNum", 160.8995);
        query.bindValue(":Run", 1);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
        }
        else
        {
            bSuccess = true;
        }
        //方案三:
        QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values (:ID, :Num, :MoneyNum, :Run)").arg(sDBTableName);
        QSqlQuery query;
        query.prepare(sql);
        query.bindValue(0, "Tom");
        query.bindValue(1, 25);
        query.bindValue(2, 160.8995);
        query.bindValue(3, 1);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
        }
        else
        {
            bSuccess = true;
        }
        //方案四:
        QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values (?, ?, ?, ?)").arg(sDBTableName);
        QSqlQuery query;
        query.prepare(sql);
        query.addBindValue("Tom");
        query.addBindValue(25);
        query.addBindValue(160.8995);
        query.addBindValue(1);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
        }
        else
        {
            bSuccess = true;
        }

    }
    closeDB();
    return bSuccess;
}

9.删除表指定记录

bool deleteDBTableAllRecord(QString sName)
{
    bool bSuccess = false;
    if(openDB())
    {
        QSqlQuery query;
        QString sql = QString("delete * from %1 where Name = '%2'").arg(sDBTableName).arg(sName);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
        }
        else
        {
            bSuccess = true;
        }
    }
    closeDB();
    return bSuccess;
}

10.更新表记录

bool updateDBTableRecord(QString sName)
{
    bool bSuccess = false;
    if(openDB())
    {
        QSqlQuery query;
        QString sql = QString("update %1 set Name = '%2'").arg(sDBTableName).arg(sName);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
        }
        else
        {
            bSuccess = true;
        }
    }
    closeDB();
    return bSuccess;
}

11.关于Qt数据库sqlite中的事务

SQLite
开启事务:"begin;";
进行回滚:"rollback;";
提交事务:"commit;"。

QSqlDatabase提供了对应的transaction、rollback、commit三个函数来执行对应操作。

1)检测是否支持事务:

qDebug() <<"DB hasFeature:Transaction:" <<db.driver()->hasFeature(QSqlDriver::Transactions);

2)示例1:

bool updateDBTableRecord(QString sName)
{
    bool bSuccess = false;
    if(openDB())
    {
        QSqlQuery query;
        QString sql = QString("update %1 set Name = '%2'").arg(sDBTableName).arg(sName);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
            query.exec("ROLLBACK");//提交
        }
        else
        {
            bSuccess = true;
            query.exec("COMMIT");//提交
        }
    }
    closeDB();
    return bSuccess;
}

示例2:

bool insertDBTableAllRecord(QString sDBTableName, QString sName, int num, double dMoneyNum, bool bRun)
{
    bool bSuccess = false;
    db.transaction();
    if(openDB())
    {
        QSqlQuery query;
        QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values('%2', %3, %4, %5)").arg(sDBTableName).arg(sName).arg(num).arg(dMoneyNum).arg(bRun);
        if(!query.exec(sql))
        {
            qDebug()<<query.lastError().text();
        }
        else
        {
            bSuccess = true;
        }
    }
    m_db.commit();
    closeDB();
    return bSuccess;
}
说明:使用事务可以提高数据库的读写效率,其次保证数据的安全性。其具有原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )等特点。

猜你喜欢

转载自blog.csdn.net/leiyang2014/article/details/125821128