1.下载sqlite3相关文件sqlite3.dll、sqlite3.h(可从http://download.csdn.net/detail/mingxia_sui/5249070下载),添加到工程的根目录下。
2. Qt的.pro文件中要加上以下两句。
QT += sql
LIBS += sqlite3.dll
这样就可以调用sqlite3中的数据库操作函数了。
3.以下的例子是一个已经封装好的类,可以直接调用哦!
.h文件代码:
#ifndef SKMONITORSQL_H
#define SKMONITORSQL_H
#include
#include
#include "sqlite3.h"
#include
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 *pData);
int fn_QueryDataByTime(QString sTableName, QDateTime dtStart,QDateTime dtEnd,QVector *pData);
int fn_QueryDataByValue(QString sTableName, int nType, QString sFrontV, QString sBackV, QVector *pData);
int fn_QueryAllData(QString sTableName, QVector *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
#include
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= 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 *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;iappend(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 *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;iappend(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 *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;iappend(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 *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;
}
参考:
https://www.yuque.com/docs/share/9d8f56e4-6e8e-493a-b483-3d06487cb266