SQLite3的使用

1.下載sqlite3相關文件sqlite3.dll、sqlite3.h(可從http://download.csdn.net/detail/mingxia_sui/5249070下載),添加到工程的根目錄下。

2.  QT += sql

   LIBS += sqlite3.dll
   Qt的.pro文件中要加上以上兩句。
這樣就可以調用sqlite3中的數據庫操作函數了。
3.以下的例子是一個已經封裝好的類,可以直接調用哦!
***************************************************************************************
***************************************************************************************
.h文件代碼:
#ifndef SKMONITORSQL_H
#define SKMONITORSQL_H


#include <QObject>
#include <QDateTime>
#include "sqlite3.h"
#include <QStringList>


class QSKMonitorSQL : public QObject
{
    Q_OBJECT
public:
    explicit QSKMonitorSQL(QString sFileName, QObject *parent = 0);
    bool fn_connectSQL();
    bool fn_closeSQL();
    void fn_InitTable(QString sTableName, QStringList sNameList, QStringList sType);
    void fn_InitTableForBase(QString sTableName, QStringList sNameList, QStringList sType);


    void fn_InsertData(QString sTableName, QStringList sDataList, QDateTime dt);
    void fn_InsertDataForBase(QString sTableName, QStringList sDataList);


    int fn_UpdateData(QString sTableName, QStringList sDataList,int index);
    void fn_DeleteData(QString sTableName);


    int fn_QueryDataByIndex(QString sTableName, int iStart,int iNumber,QVector<QStringList> *pData);
    int fn_QueryDataByTime(QString sTableName, QDateTime dtStart,QDateTime dtEnd,QVector<QStringList> *pData);
    int fn_QueryDataByValue(QString sTableName, int nType, QString sFrontV, QString sBackV, QVector<QStringList> *pData);
    int fn_QueryAllData(QString sTableName, QVector<QStringList> *pData);


    int fn_RecordSize(QString sTableName);
    uint fn_GetMinRowID(QString sTableName);
    bool fn_RecordSizeByTime(QString sTableName, QDateTime dtStart, QDateTime dtEnd, int *pRows, int *pMaxID,int *pMinID);


    QString fn_UnicodeToUTF8(QString str);


    void fn_StartBegin();
    void fn_StartCommit();


    bool m_bDBIsOk;


    int m_nSetMaxRecordNum;
    bool m_bSetRecordFlag;
    void fn_SetMaxRowId(int nMaxRows);


public:
    bool m_bStartBegin;
    bool m_bStartCommit;


signals:


public slots:


private:
    QString m_sDB;
    QString m_sInsertT1;
    QString m_sUpdateT1;
    QString m_sTable;
    QStringList m_sTitleList;  //列名
    int m_nColumn;
    sqlite3 *m_pdb;            //數據庫
    char *m_pzErrMsg;          //出錯信息
    char  *m_perrmsg;          //出錯信息
    char  **m_ppazResult;


};


#endif // SKMONITORSQL_H
***************************************************************************************
***************************************************************************************
.cpp文件:
#include "SKMonitorSQL.h"
#include <QTextCodec>
#include <QVector>


QSKMonitorSQL::QSKMonitorSQL(QString sFileName, QObject *parent) :
    QObject(parent)
{
    m_pdb = NULL;


    m_nSetMaxRecordNum = 0;
    m_bSetRecordFlag = false;


    //編碼轉換
    m_sDB = fn_UnicodeToUTF8(sFileName);//編碼轉換


    m_bStartBegin = false;            //初始化沒有插入BEGIN命令
    m_bStartCommit = false;           //初始化沒有插入COMMIT命令
}


/*********************************************************************************************
  Func: 連接到指定數據庫
  input: null
  ouput:null
 ********************************************************************************************/
bool QSKMonitorSQL::fn_connectSQL()
{
    if( (sqlite3_open(m_sDB.toAscii().data(), &m_pdb)) != 0 ) //打開指定的數據庫文件,如果不存在將創建一個同名的數據庫文件
    {
        m_bDBIsOk = false;
        return false;
    }
    m_bDBIsOk = true;
    return true;
}


/*********************************************************************************************
  Func: 關閉指定數據庫
  input: null
  ouput:null
 ********************************************************************************************/
bool QSKMonitorSQL::fn_closeSQL()
{
    if (m_pdb!=NULL)
    {
        sqlite3_close(m_pdb);
    }
    return false;
}


/*********************************************************************************************
  Func: 運行BEGIN命令
  input: null
  ouput:null
 ********************************************************************************************/
void QSKMonitorSQL::fn_StartBegin()
{
    if (m_bStartBegin == false)
    {
        if (m_pdb != NULL)
        {
            QString stmp;
            stmp = "begin;";
            stmp = fn_UnicodeToUTF8(stmp);     //編碼轉換
            sqlite3_exec( m_pdb , stmp.toAscii().data() , 0 , 0 , &m_pzErrMsg );
            m_bStartBegin = true;
            m_bStartCommit = false;
        }
    }
}
/*********************************************************************************************
  Func: 運行commit命令
  input: null
  ouput:null
 ********************************************************************************************/
void QSKMonitorSQL::fn_StartCommit()
{
    if (m_bStartCommit == true)            //提交,存入磁盤
    {
        if (m_pdb != NULL)
        {
            QString stmp;
            stmp = "commit;";
            stmp = fn_UnicodeToUTF8(stmp);     //編碼轉換
            sqlite3_exec( m_pdb , stmp.toAscii().data() , 0 , 0 , &m_pzErrMsg );
            m_bStartBegin = false;
            m_bStartCommit = false;
        }
    }
}


/*********************************************************************************************
  Func: 初始化數據表
  input: 表名,表列名
  ouput:null
 ********************************************************************************************/
void QSKMonitorSQL::fn_InitTable(QString sTableName, QStringList sNameList, QStringList sType)
{
    fn_StartBegin();
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "create table " + sTableName + "(logtime datetime";


        for (int i=0;i<sNameList.size();i++)
        {
            stmp = stmp + "," + sNameList.at(i) + " " + sType.at(i);
        }


        stmp = stmp + ")";
        stmp = stmp + ";";


        stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
        sqlite3_exec(m_pdb, stmp.toAscii().data(), NULL, NULL, &m_pzErrMsg);


        m_sInsertT1 = "insert into ";
        m_sInsertT1 = m_sInsertT1 + sTableName + " values(";        //記錄插入語句部分str
        m_sTable = sTableName;                    //表的名字
        m_nColumn = sNameList.size() + 1;         //列總數=記錄列數+時間
        m_sUpdateT1 = "update " + sTableName;     //記錄修改語句
        m_sUpdateT1 = m_sUpdateT1 + " set ";
        m_sTitleList = sNameList;                 //列名稱
    }
    fn_StartCommit();
}


/*********************************************************************************************
  Func: 初始化數據表
  input: 表名,表列名
  ouput:null
 ********************************************************************************************/
void QSKMonitorSQL::fn_InitTableForBase(QString sTableName, QStringList sNameList, QStringList sType)
{
    fn_StartBegin();
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "create table " + sTableName + "(";


        for (int i=0;i<sNameList.size();i++)
        {
            if (i != 0)
            {
                stmp += ",";
            }
            stmp = stmp + sNameList.at(i) + " " + sType.at(i);
        }


        stmp = stmp + ")";
        stmp = stmp + ";";


        stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
        sqlite3_exec(m_pdb, stmp.toAscii().data(), NULL, NULL, &m_pzErrMsg);


        m_sInsertT1 = "insert into ";
        m_sInsertT1 = m_sInsertT1 + sTableName + " values(";        //記錄插入語句部分str
        m_sTable = sTableName;                    //表的名字
        m_nColumn = sNameList.size() + 1;         //列總數=記錄列數+時間
        m_sUpdateT1 = "update " + sTableName;     //記錄修改語句
        m_sUpdateT1 = m_sUpdateT1 + " set ";
        m_sTitleList = sNameList;                 //列名稱
    }
    fn_StartCommit();
}


/*********************************************************************************************
  Func: 增加數據到數據庫
  input: null
  ouput:null
 ********************************************************************************************/
void QSKMonitorSQL::fn_InsertData(QString sTableName, QStringList sDataList, QDateTime dt)
{
    fn_StartBegin();
    if (m_pdb!=NULL)
    {
        if (m_bSetRecordFlag)//設置了最大行數
        {
            int nMaxRecordSize = fn_RecordSize(sTableName);//當前最大記錄數
            if (nMaxRecordSize < 0) return;


            if (nMaxRecordSize >= m_nSetMaxRecordNum)//超出限制,刪掉開始項
            {
                QString stmp;
                stmp = "delete from ";
                stmp = stmp + sTableName;
                stmp = stmp + " where rowid <= (select min(rowid) from ";
                stmp = stmp + sTableName + ");";


                stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
                sqlite3_exec(m_pdb, stmp.toAscii().data(), NULL, NULL, &m_pzErrMsg);
            }


            QString stmp;
            stmp = "insert into ";
            stmp = stmp + sTableName + " values(";
            QString sdatetime = dt.toString("yyyy-MM-dd hh:mm:ss");
            stmp = stmp + "'";
            stmp = stmp + sdatetime;
            stmp = stmp + "'";


            for (int i=0;i<sDataList.size();i++)
            {
                stmp = stmp + ",'";
                stmp = stmp + sDataList.at(i) + "'";
            }
            stmp = stmp + ")";
            stmp = stmp + ";";


            stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
            sqlite3_exec(m_pdb, stmp.toAscii().data(), NULL, NULL, &m_pzErrMsg );
        }
        else
        {
            QString stmp;
            stmp = "insert into ";
            stmp = stmp + sTableName + " values(";
            QString sdatetime = dt.toString("yyyy-MM-dd hh:mm:ss");
            stmp = stmp + "'";
            stmp = stmp + sdatetime;
            stmp = stmp + "'";


            for (int i=0;i<sDataList.size();i++)
            {
                stmp = stmp + ",'";
                stmp = stmp + sDataList.at(i) + "'";
            }
            stmp = stmp + ")";
            stmp = stmp + ";";


            stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
            sqlite3_exec(m_pdb, stmp.toAscii().data(), NULL, NULL, &m_pzErrMsg );
        }
    }
    fn_StartCommit();
}


/*********************************************************************************************
  Func: 增加數據到數據庫
  input: null
  ouput:null
 ********************************************************************************************/
void QSKMonitorSQL::fn_InsertDataForBase(QString sTableName, QStringList sDataList)
{
    fn_StartBegin();
    if (m_pdb!=NULL)
    {
        QString stmp;


        stmp.clear();
        stmp = "insert into ";
        stmp = stmp + sTableName + " values(";


        for (int i=0; i<sDataList.size(); i++)
        {
            if (i != 0)
            {
                stmp = stmp + ",";
            }
            stmp = stmp + "'";
            stmp = stmp + sDataList.at(i) + "'";
        }


        stmp = stmp + ")";
        stmp = stmp + ";";


        stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
        sqlite3_exec(m_pdb ,stmp.toAscii().data(), NULL, NULL, &m_pzErrMsg);
    }
    fn_StartCommit();
}


/*********************************************************************************************
  Func: 修改數據庫數據
  input: null
  ouput:null
 ********************************************************************************************/
int QSKMonitorSQL::fn_UpdateData(QString sTableName, QStringList sDataList, int index)
{
    int  nRet = -1;
    fn_StartBegin();
    if (m_pdb!=NULL)
    {
        QString stmp;
        int isize;
        stmp = "update " + sTableName;     //修改語句
        stmp = stmp + " set ";


        isize = sDataList.size();
        for (int i=0;i<isize;i++)
        {
            stmp = stmp + m_sTitleList.at(i);
            stmp = stmp + " = ";
            stmp = stmp + "'";
            stmp = stmp + sDataList.at(i);
            stmp = stmp + "'";
            if (i != isize - 1)             //不是最後一個時
            {
                stmp = stmp + ",";
            }
        }
        stmp = stmp + " where rowid = (select MIN(rowid) + ";
        stmp = stmp + QString::number(index);
        stmp = stmp + " from ";
        stmp = stmp + m_sTable;
        stmp = stmp + ")";
        stmp = stmp + ";";


        stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
        nRet = sqlite3_exec(m_pdb, stmp.toAscii().data(), NULL, NULL, &m_pzErrMsg );
    }
    fn_StartCommit();


    return nRet;
}


/*********************************************************************************************
  Func: 刪除數據
  input: null
  ouput:null
 ********************************************************************************************/
void QSKMonitorSQL::fn_DeleteData(QString sTableName)
{
    fn_StartBegin();
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "delete from ";
        stmp = stmp + sTableName;
        stmp = stmp + ";";


        stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
        sqlite3_exec(m_pdb , stmp.toAscii().data() , NULL , NULL , &m_pzErrMsg );
    }
    fn_StartCommit();
}


/*********************************************************************************************
  Func: 上電時獲得最小的rowid序號
  input: null
  ouput:null
 ********************************************************************************************/
uint QSKMonitorSQL::fn_GetMinRowID(QString sTableName)
{
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "select min(rowid) from ";
        stmp = stmp + sTableName;
        stmp = stmp + ";";
        int nRow;
        int nColumn;


        stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
        int result = sqlite3_get_table(m_pdb, stmp.toAscii().data(), &m_ppazResult, &nRow, &nColumn, &m_pzErrMsg );
        if (result == SQLITE_OK)
        {
            QString sData;
            sData.sprintf("%s", m_ppazResult[1]);
            int nMin;
            nMin = sData.toInt();
            sqlite3_free_table(m_ppazResult);          //釋放
            return nMin;
        }
        else
        {
            sqlite3_free_table(m_ppazResult);          //釋放
            return 0;
        }
    }
    else
    {
        return 0;
    }
}


/*********************************************************************************************
  Func: 獲得數據庫記錄大小
  input: null
  ouput:記錄條數
 ********************************************************************************************/
int QSKMonitorSQL::fn_RecordSize(QString sTableName)
{
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "select count(*) from ";
        stmp = stmp + sTableName;
        int nRow;
        int nColumn;


        stmp = fn_UnicodeToUTF8(stmp);//編碼轉換
        int result = sqlite3_get_table(m_pdb , stmp.toAscii().data(), &m_ppazResult , &nRow , &nColumn , &m_pzErrMsg );
        if (result == SQLITE_OK)
        {
            QString sNum;
            sNum.sprintf("%s",m_ppazResult[1]);
            sqlite3_free_table(m_ppazResult);
            return sNum.toInt();
        }
        else
        {
            sqlite3_free_table(m_ppazResult);
            return -1;
        }
    }
    else
    {
        return 0;
    }
}


/*********************************************************************************************
  Func: 獲取數據庫全部數據
  input: pData-返回的查詢數據
  ouput:返回查詢結果總數
 ********************************************************************************************/
int QSKMonitorSQL::fn_QueryAllData(QString sTableName, QVector<QStringList> *pData)
{
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "select * from ";
        stmp = stmp + sTableName;


        //格式化查詢語句


        int nRow;
        int nColumn;
        int result = sqlite3_get_table(m_pdb , stmp.toAscii().data(), &m_ppazResult , &nRow , &nColumn ,
                                        &m_pzErrMsg );
        if (result == SQLITE_OK)
        {
            QStringList listTmp;
            QString sData;
            for (int i=0;i<nRow;i++)
            {
                int iTmp;
                iTmp = (i + 1)*nColumn;             //返回數據中,前nColumn個是字段名字,偏移字段數目
                for (int j=0;j<nColumn;j++)
                {
                    sData.sprintf("%s",m_ppazResult[iTmp + j]);
                    listTmp.append(sData);
                }
                pData->append(listTmp);
                listTmp.clear();
            }
            sqlite3_free_table(m_ppazResult);          //釋放
            return nRow;
        }
        else
        {
            sqlite3_free_table(m_ppazResult);          //釋放
            return -1;
        }
    }
    else
    {
        return -1;
    }
}


/*********************************************************************************************
  Func: 按序號查詢指定範圍的數據
  input: iStart-開始rowid序號 iNumber-查詢總數 pData-返回的查詢數據
  ouput:返回查詢結果總數
 ********************************************************************************************/
int QSKMonitorSQL::fn_QueryDataByIndex(QString sTableName, int iStart, int iNumber, QVector<QStringList> *pData)
{
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "select * from ";
        stmp = stmp + sTableName + " ";
        stmp = stmp + "where rowid >= ";
        stmp =  stmp + QString::number(iStart) + " limit ";
        stmp = stmp + QString::number(iNumber);
        int nRow;
        int nColumn;
        int result = sqlite3_get_table(m_pdb , stmp.toAscii().data(), &m_ppazResult , &nRow , &nColumn ,
                                        &m_pzErrMsg );
        if (result == SQLITE_OK)
        {
            QStringList listTmp;
            QString sData;
            for (int i=0;i<nRow;i++)
            {
                int iTmp;
                iTmp = (i + 1)*nColumn;             //返回數據中,前nColumn個是字段名字,偏移字段數目
                for (int j=0;j<nColumn;j++)
                {
                    sData.sprintf("%s",m_ppazResult[iTmp + j]);
                    listTmp.append(sData);
                }
                pData->append(listTmp);
                listTmp.clear();
            }
            sqlite3_free_table(m_ppazResult);          //釋放
            return nRow;
        }
        else
        {
            sqlite3_free_table(m_ppazResult);          //釋放
            return -1;
        }
    }
    else
    {
        return -1;
    }
}


/*********************************************************************************************
  Func: 按時間查詢指定範圍的數據
  input: dtStart-開始時間 dtEnd-結束時間 pData-返回的查詢數據
  ouput:返回查詢結果總數
 ********************************************************************************************/
int QSKMonitorSQL::fn_QueryDataByTime(QString sTableName, QDateTime dtStart, QDateTime dtEnd, QVector<QStringList> *pData)
{
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "select * from ";
        stmp = stmp + sTableName + " ";
        stmp = stmp + "where logtime >= ";
        stmp =  stmp + "'" + dtStart.toString("yyyy-MM-dd hh:mm:ss") + "'" + " and logtime <= ";
        stmp =  stmp  + "'" + dtEnd.toString("yyyy-MM-dd hh:mm:ss") + "'";
        int nRow;
        int nColumn;
        int result = sqlite3_get_table(m_pdb , stmp.toAscii().data(), &m_ppazResult , &nRow , &nColumn ,
                                        &m_pzErrMsg );
        if (result == SQLITE_OK)
        {
            QStringList listTmp;
            QString sData;
            for (int i=0;i<nRow;i++)
            {
                int iTmp;
                iTmp = (i + 1)*nColumn;             //返回數據中,前nColumn個是字段名字,偏移字段數目
                for (int j=0;j<nColumn;j++)
                {
                    sData.sprintf("%s",m_ppazResult[iTmp + j]);
                    listTmp.append(sData);
                }
                pData->append(listTmp);
                listTmp.clear();
            }
            sqlite3_free_table(m_ppazResult);          //釋放
            return nRow;
        }
        else
        {
            sqlite3_free_table(m_ppazResult);          //釋放z
            return -1;
        }
    }
    else
    {
        return 0;
    }
}


/*********************************************************************************************
  Func: 按值查詢指定範圍的數據
  input: nType-比較條件 nFrontV-比較前值 nBackV-比較後值 pData-返回的查詢數據
  ouput:返回查詢結果總數
 ********************************************************************************************/
int QSKMonitorSQL::fn_QueryDataByValue(QString sTableName, int nType, QString sFrontV, QString sBackV, QVector<QStringList> *pData)
{
    return true;
}


/*********************************************************************************************
  Func: 有開始時間和結束時間算出這段時間有多少數據
  input: 開始時間 結束時間 返回行數 最小rowid
  ouput:找到數據返回1 沒有找到返回0
  Select count(*) From MAIN.[hisdata] where hisdata.logtime >= '2012-05-24 15:53:48'
and hisdata.logtime >= '2012-05-24 15:55:48' ;
 ********************************************************************************************/
bool QSKMonitorSQL::fn_RecordSizeByTime(QString sTableName, QDateTime dtStart, QDateTime dtEnd, int *pRows, int *pMaxID,int *pMinID)
{
    if (m_pdb!=NULL)
    {
        QString stmp;
        stmp = "select count(*), MIN(rowid), MAX(rowid) from ";
        stmp = stmp + sTableName + " ";
        stmp = stmp + "where logtime >= ";
        stmp =  stmp + "'" + dtStart.toString("yyyy-MM-dd hh:mm:ss") + "'" + " and logtime <= ";
        stmp =  stmp  + "'" + dtEnd.toString("yyyy-MM-dd hh:mm:ss") + "'";
        int nRow;
        int nColumn;
        int result = sqlite3_get_table(m_pdb , stmp.toAscii().data(), &m_ppazResult , &nRow , &nColumn ,
                                        &m_pzErrMsg );
        if (result == SQLITE_OK)
        {
            QString sData;
            int counts;
            sData.sprintf("%s",m_ppazResult[3]);           //獲得返回條數
            counts = sData.toInt();                     //行數
            if (counts == 0)                            //沒有數據
            {
                *pRows = counts;
                *pMinID = 0;
                *pMaxID = 0;
            }
            else
            {
                *pRows = counts;
                sData.sprintf("%s",m_ppazResult[4]);           //獲得最小rowid
                *pMinID = sData.toInt();
                sData.sprintf("%s",m_ppazResult[5]);           //獲得最大rowid
                *pMaxID = sData.toInt();


            }
        }
        sqlite3_free_table(m_ppazResult);          //釋放
        return 1;
    }
    else
    {
        *pRows = 0;
        *pMinID = 0;
        *pMaxID = 0;
        return 0;
    }
}


/*********************************************************************************************
  Func: 設置最大行數
  input: nMaxRows:最大行數值
  ouput: 無
 ********************************************************************************************/
void QSKMonitorSQL::fn_SetMaxRowId(int nMaxRows)
{
    m_nSetMaxRecordNum = nMaxRows;
    m_bSetRecordFlag = true;
}


/*********************************************************************************************
  Func: unicode 到UTF8轉換
  input: null
  ouput:null
 ********************************************************************************************/
QString QSKMonitorSQL::fn_UnicodeToUTF8(QString str)
{
    QString sName;
    QByteArray baT4;
    baT4.clear();
    baT4=QTextCodec::codecForName("UTF8")->fromUnicode(str);
    sName = (QString)baT4;
    return sName;
}
***************************************************************************************
***************************************************************************************

That's all!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章