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!
http://blog.csdn.net/mingxia_sui/article/details/8502179
-------------------------------------------------------------------------------------------
sqlite 查詢數據 不用回調
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
//打開數據庫連接
rc = sqlite3_open("zieckey.db", &db);
if( rc )
{
fprintf(stderr, "Can't open sqlite: %s/n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else printf("open sqlite success/n");
//查詢
char* sql = "SELECT rowid,name FROM test ";
int nrow = 0;
int ncolumn = 0;
char ** azResult; //返回結果集
sqlite3_get_table(db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
printf("row:%d,column:%d/n",nrow,ncolumn);
int i;
int j;
//讀取結果集並釋放
for(i=0;i<=nrow;i++)
{
for(j=0;j {
printf("value:%s ",azResult[i*ncolumn+j]);
}
printf("/n");
}
sqlite3_close(db); //關閉數據庫
return 0;
}
http://blog.csdn.net/zhangxiaonanwin/article/details/6087987
