sqlite数据库包装类

SQLite 是 D. Richard Hipp 用 C 语言编写的开源嵌入式数据库引擎。它是完全独立的,不具有外部依赖性。 我下面提供一个Sqlite数据库包装类,供读者在相应的场合使用。

SQLite的官方网站下载地址是 http://www.sqlite.org/download.html,有兴趣的读者可以到这上面去下载最新的版本。

同时,要关注SQLite处理语句与标准SQL稍有不同的几个地方(比如Top语句等),具体的可以去网上搜索。

我的EMAIL是 wxy3064one@163.com

(一) 头文件 h

#ifndef _Q_MEMORY_DB_H
#define _Q_MEMORY_DB_H

#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
#pragma comment(lib,"lib/sqlite3.lib")
#include "include/sqlite3.h"
#else
#include <sqlite3.h>
#define SQLITE_THREADSAFE 1//支持多线程
#endif

#ifdef __cplusplus
}
#endif

#define BS_LINE_TABLE_NAME "T_BL"
#define BS_LINE_DROP_SQL "drop table T_BL;"
#define BS_LINE_CREAT_SQL "create table T_BL(SQLITE_ID integer primary key,/
LON real,/
LAT real,/
CELLID integer,/
LAC integer); "
#define BS_LINE_INSERT_SQL "insert into T_BL values(?,?,?); "
#define BS_LINE_CREATE_INDEX_CI_LAC_SQL "create index idx_cellid_lac on T_BL(CELLID,LAC);"

class CMemDB
{
private:
bool InMemory;
int nTimeOut;
bool eof;
sqlite3 *db;
sqlite3_stmt* stmt;
int sql_code;
int total_rows,total_cols;
void Finalize();
void Close();
bool ExistTable(CString tbName);
public:

enum MemDBFieldType{ft_INT = 1,ft_FLOAT,ft_TEXT,ft_BLOB,ft_NULL};

CMemDB(int ATimeOut=60000);
virtual ~CMemDB();

void CreateMemoryDB();
const char* GetErrMsg();
//使用sqlite3_stmt
//执行带绑定参数的SQL语句
void PrepareSQL(CString szSQL);
bool Bind(int nCol,const char* szText);
bool Bind(int nCol,const int nValue);
bool Bind(int nCol,const double dwValue);
bool Bind(int nCol,const BYTE* vBlob,int nLen);
bool BindNULL(int nCol);
int Exec();
//执行SQL语句(有返回结果)
int ExecSQL(CString szSQL);
//直接执行(无返回结果)
int ExecCallBackSQL(CString szSQL,sqlite3_callback func = 0,void* para= NULL);//带回调函数的SQL
//直接执行END
//字段操作
int FindIndex(CString szField);
const char* FieldName(int nCol);
const int GetFieldType(CString szField);
const int GetFieldType(int nCol);
bool FieldIsNULL(CString szField);
bool FieldIsNULL(int nCol);
int GetIntFieldByName(CString szField,int nDefault=0);
int GetIntFieldByIndex(int nCol,int nDefault=0);
double GetDoubleFieldByName(CString szField,double fDefault=0.00);
double GetDoubleFieldByIndex(int nCol,double fDefault=0.00);
const char* GetTextFieldByName(CString szField,const char* sDefault="");
const char* GetTextFieldByIndex(int nCol,const char* sDefault="");
const BYTE* GetBlobFieldByName(CString szField,int *nLen);
const BYTE* GetBlobFieldByIndex(int nCol,int *nLen);
//行列操作
bool Eof();
void Reset();
int Next();
int GetCols();
//使用sqlite3_stmt END
//Other Operation
bool BeginTran();
bool CommitTran();
bool RollbackTran();
void setTimeOut(int ATimeOut);
void Interrupt();
sqlite_int64 GetLastRowID();
//特殊应用
protected:
CString CurTableName;

public:
//针对基站和DT的拉线
bool FindBLKey(CString ACIValue,CString ALACValue);
void CreateBLTable();

//读取shape文件的dbf(主要是点数据的文本内容,线和面一般不做处理)
bool FindKey(CString szID);
CString GetValue(CString oid,int nFieldIndex);
void AddDBFromFile(CString dbFileName);

};
#endif

(二) 实现文件

#include "stdafx.h"
#include "kml_baseclass.h"
#include "MapFileReader.h"
#include "MemDB.h"

CMemDB::CMemDB(int ATimeOut)
{
CurTableName = "";
db = NULL; stmt = NULL;eof = false;
InMemory = false;
total_cols = -1;total_rows = -1;;
sql_code = sqlite3_open(":memory:",&db);
if (sql_code == SQLITE_OK)
InMemory = true;
setTimeOut(ATimeOut);
}
CMemDB::~CMemDB()
{
Close();
}

void CMemDB::CreateMemoryDB()
{
Close();
sql_code = sqlite3_open(":memory:",&db);
if (sql_code == SQLITE_OK)
InMemory = true;
}
void CMemDB::Finalize()
{
if (stmt)
{
sql_code = sqlite3_finalize(stmt);
stmt = NULL;
}
}
void CMemDB::Close()
{
Finalize();
if (db)
{
sqlite3_close(db);
db = NULL;
}
InMemory = false;
}

bool CMemDB::ExistTable(CString tbName)
{
bool ret = false;
if (db)
{
if (ExecSQL("select count(*) from sqlite_master where type='table' and name='"+tbName+"'") != -1)
{
if (GetIntFieldByIndex(0)==1)
{
ret =true;
}
}
}
return ret;
}

const char* CMemDB::GetErrMsg()
{
return db?sqlite3_errmsg(db):"";
}

int CMemDB::ExecCallBackSQL(CString szSQL,sqlite3_callback func,void* para)
{
int ret = -1;
char* szMsg = NULL;
if (db)
{
sql_code = sqlite3_exec(db,AnsiToUtf8(szSQL),func,para,&szMsg);
if (sql_code == SQLITE_OK)
ret = 0;
if (szMsg != NULL)
{
sqlite3_free(szMsg);
szMsg = NULL;
}
}
return ret;
}
void CMemDB::PrepareSQL(CString szSQL)
{
Finalize();
if ((sql_code = sqlite3_prepare(db,-1,&stmt,0)) != SQLITE_OK)
{
stmt = NULL;
}
}
bool CMemDB::Bind(int nCol,const char* szText)
{
bool bRet = false;
if (stmt != NULL)
{
if ((sql_code =sqlite3_bind_text(stmt,nCol+1,szText,SQLITE_TRANSIENT)) == SQLITE_OK)
bRet = true;
}
return bRet;
}
bool CMemDB::Bind(int nCol,const int nValue)
{
bool bRet = false;
if (stmt != NULL)
{
if ((sql_code =sqlite3_bind_int(stmt,nValue)) == SQLITE_OK)
bRet = true;
}
return bRet;
}
bool CMemDB::Bind(int nCol,const double dwValue)
{
bool bRet = false;
if (stmt != NULL)
{
if ((sql_code =sqlite3_bind_double(stmt,dwValue)) == SQLITE_OK)
bRet = true;
}
return bRet;
}
bool CMemDB::Bind(int nCol,int nLen)
{
bool bRet = false;
if (stmt != NULL)
{
if ((sql_code = sqlite3_bind_blob(stmt,(const void*)vBlob,nLen,SQLITE_TRANSIENT)) == SQLITE_OK)
bRet = true;
}
return bRet;
}
bool CMemDB::BindNULL(int nCol)
{
bool bRet = false;
if (stmt != NULL)
{
if ((sql_code =sqlite3_bind_null(stmt,nCol+1)) == SQLITE_OK)
bRet = true;
}
return bRet;
}
int CMemDB::Exec()
{
int ret = -1;
if (stmt != NULL && db != NULL)
{
if ((sql_code = sqlite3_step(stmt)) == SQLITE_DONE)
{
ret = sqlite3_changes(db);
}
//sql_code = sqlite3_reset(stmt);
}
return ret;
}
int CMemDB::ExecSQL(CString szSQL)
{
int ret = -1;
if (db)
{
PrepareSQL(szSQL);
if (stmt)
{
sql_code = sqlite3_step(stmt);
if (sql_code == SQLITE_DONE)
{
eof = true;
//ret = 0;
}else if (sql_code == SQLITE_ROW)
{
eof = false;
ret = 0;
}else {
Finalize();
total_rows = 0;
total_cols = 0;
}
if (stmt)
{
total_cols = sqlite3_column_count(stmt);
}
}
}
return ret;
}

int CMemDB::FindIndex(CString szField)
{
int index = -1;
CString tmpstr,tmpfield;
if (stmt != NULL)
{
tmpfield = szField;
tmpfield.TrimLeft();
tmpfield.TrimRight();
if (tmpfield != "")
{
for(int i = 0;i<total_cols;i++)
{
const char* sztmp = sqlite3_column_name(stmt,i);
tmpstr = sztmp;
tmpstr.MakeUpper();
if ( sztmp != 0 && strcmp((LPCTSTR)tmpfield,(LPCTSTR)tmpstr)==0)
{
index = i;
break;
}
}
}
}
return index;
}
const char* CMemDB::FieldName(int nCol)
{
if (!stmt) return NULL;
if (!(nCol <0 || nCol > total_cols - 1))
return sqlite3_column_name(stmt,nCol);
else return NULL;
}
const int CMemDB::GetFieldType(CString szField)
{
int index = -1;
if (stmt == NULL)
return index;
index = FindIndex(szField);
if (index == -1)
return index;
else
return sqlite3_column_type(stmt,index);
}
const int CMemDB::GetFieldType(int nCol)
{
int index = -1;
if (stmt == NULL)
return index;
if (nCol <0 || nCol > total_cols - 1)
return index;
else
return sqlite3_column_type(stmt,nCol);
}
bool CMemDB::FieldIsNULL(CString szField)
{
int index;
bool bRet = true;
if ((index = GetFieldType(szField)) != -1)
bRet = (index == SQLITE_NULL);
return bRet;
}
bool CMemDB::FieldIsNULL(int nCol)
{
int index;
bool bRet = true;
if ((index = GetFieldType(nCol)) != -1)
bRet = (index == SQLITE_NULL);
return bRet;
}
int CMemDB::GetIntFieldByName(CString szField,int nDefault)
{
if (!stmt)
return nDefault;
else{
int index = FindIndex(szField);
if (index == -1) return nDefault;
if (FieldIsNULL(szField)) return nDefault;
return sqlite3_column_int(stmt,index);
}
}
int CMemDB::GetIntFieldByIndex(int nCol,int nDefault)
{
if (!stmt)
return nDefault;
else{
if (FieldIsNULL(nCol)) return nDefault;
return sqlite3_column_int(stmt,nCol);
}
}
double CMemDB::GetDoubleFieldByName(CString szField,double fDefault)
{
if (!stmt)
return fDefault;
else{
int index = FindIndex(szField);
if (index == -1) return fDefault;
if (FieldIsNULL(szField)) return fDefault;
return sqlite3_column_double(stmt,index);
}
}
double CMemDB::GetDoubleFieldByIndex(int nCol,double fDefault)
{
if (!stmt)
return fDefault;
else{
if (FieldIsNULL(nCol)) return fDefault;
return sqlite3_column_double(stmt,nCol);
}
}
const char* CMemDB::GetTextFieldByName(CString szField,const char* sDefault)
{
if (!stmt)
return sDefault;
else{
int index = FindIndex(szField);
if (index == -1) return sDefault;
if (FieldIsNULL(szField)) return sDefault;
return (const char*)sqlite3_column_text(stmt,index);
}
}
const char* CMemDB::GetTextFieldByIndex(int nCol,const char* sDefault)
{
if (!stmt)
return sDefault;
else{
if (FieldName(nCol) == NULL) return sDefault;
if (FieldIsNULL(nCol)) return sDefault;
return (const char*)sqlite3_column_text(stmt,nCol);
}
}
const BYTE* CMemDB::GetBlobFieldByName(CString szField,int *nLen)
{
BYTE* pData = 0;
*nLen = 0;
if (!FieldIsNULL(szField))
{
int index = FindIndex(szField);
if (index != -1)
{
*nLen = sqlite3_column_bytes(stmt,index);
pData = (BYTE*)sqlite3_column_blob(stmt,index);
}
}
return pData;
}
const BYTE* CMemDB::GetBlobFieldByIndex(int nCol,int *nLen)
{
BYTE* pData = 0;
*nLen = 0;
if (!FieldIsNULL(nCol))
{
*nLen = sqlite3_column_bytes(stmt,nCol);
pData = (BYTE*)sqlite3_column_blob(stmt,nCol);
}
return pData;
}
bool CMemDB::Eof()
{
return eof;
}
void CMemDB::Reset()
{
if(stmt)
{
eof = !(sqlite3_reset(stmt)==SQLITE_OK);
}
}
int CMemDB::Next()
{
int ret = -1;
if (stmt)
{
sql_code = sqlite3_step(stmt);
if (sql_code == SQLITE_DONE)
{
eof = true;
ret = 0;
}else if (sql_code == SQLITE_ROW)
{
eof = false;
ret = 0;
}else {
Finalize();
}
}
return ret;
}
int CMemDB::GetCols()
{
return total_cols;
}
bool CMemDB::BeginTran()
{
return (ExecCallBackSQL("begin transaction;")!=-1);
}
bool CMemDB::CommitTran()
{
return (ExecCallBackSQL("commit transaction;")!=-1);
}
bool CMemDB::RollbackTran()
{
return (ExecCallBackSQL("rollback transaction;")!=-1);
}
void CMemDB::setTimeOut(int ATimeOut)
{
if (db)
{
nTimeOut = ATimeOut;
sqlite3_busy_timeout(db,nTimeOut);
}
}
void CMemDB::Interrupt()
{
if (db)
{
sqlite3_interrupt(db);
}
}

sqlite_int64 CMemDB::GetLastRowID()
{
return sqlite3_last_insert_rowid(db);
}

void CMemDB::CreateBLTable()
{
if (ExistTable(BS_LINE_TABLE_NAME))
{
ExecCallBackSQL(BS_LINE_DROP_SQL);
}
ExecCallBackSQL(BS_LINE_CREAT_SQL);
ExecCallBackSQL(BS_LINE_CREATE_INDEX_CI_LAC_SQL);
CurTableName = BS_LINE_TABLE_NAME;
}

bool CMemDB::FindBLKey(CString ACIValue,CString ALACValue)
{
CString szSQL;
bool ret = false;
if (db && CurTableName.IsEmpty() == false)
{
szSQL = "select * from " + CurTableName + " where CELLID="+ACIValue+" and LAC="+ALACValue + " limit 0,1";
if (ExecSQL(szSQL) == 0)
ret = true;
}
return ret;
}

bool CMemDB::FindKey(CString szID)
{
CString szSQL;
bool ret = false;
if (db && CurTableName.IsEmpty() == false)
{
szSQL = "select * from " + CurTableName + " where SQLITE_ID ="+szID;
if (ExecSQL(szSQL) == 0)
ret = true;
}
return ret;
}

CString CMemDB::GetValue(CString oid,int nFieldIndex)
{
CString ret = "";
if (FindKey(oid))
{
switch(GetFieldType(nFieldIndex))
{
case CMemDB::ft_TEXT: {
ret = GetTextFieldByIndex(nFieldIndex);
}break;
case CMemDB::ft_INT: ret = IntToStr(GetIntFieldByIndex(nFieldIndex)); break;
case CMemDB::ft_FLOAT:ret = FloatToStr(GetDoubleFieldByIndex(nFieldIndex)); break;
default:ret = "";break;
}
}
return ret;
}

void CMemDB::AddDBFromFile(CString dbFileName)
{
int i,j;
int NumRecs,FieldCount;
CString fname,ext;
CString dbSelectSQL,dbCreateSQL,dbInsertSQL;
CDBFFileReader* dbFile;
if (dbFileName.IsEmpty()==false)
{
if (!InMemory)
CreateMemoryDB();
dbFile = new CDBFFileReader();
if (dbFile->Open(dbFileName))
{
fname = ExtractFileName(dbFileName);
ext = ExtractFileExt(dbFileName);
fname = fname.Mid(0,fname.GetLength() - ext.GetLength());
FieldCount = dbFile->GetFieldCount();
dbSelectSQL = "select * from "+fname+";";
if (!ExistTable(fname))
{
dbCreateSQL = "create table "+fname+" (SQLITE_ID integer primary key ";
dbInsertSQL = "insert into "+fname;
for(i=0;i<FieldCount;i++)
{
switch(dbFile->GetFieldTypeByIndex(i))
{
case 'C':{
dbCreateSQL += ","+dbFile->GetFieldNameByIndex(i)+" char("+IntToStr(dbFile->GetFieldLenByIndex(i))+")";
}break;
case 'F':{
dbCreateSQL += ","+dbFile->GetFieldNameByIndex(i)+" real ";
}break;
case 'N':{
dbCreateSQL += ","+dbFile->GetFieldNameByIndex(i)+" integer ";
}break;
case 'D':{
dbCreateSQL += ","+dbFile->GetFieldNameByIndex(i)+" char(8)";//date
}break;
case 'L':{
dbCreateSQL += ","+dbFile->GetFieldNameByIndex(i)+" char(1)";
}break;
case 'M':
default:break;
}
}
dbCreateSQL += ");";
dbInsertSQL+=" values(?";
for(i=0;i<FieldCount;i++)
dbInsertSQL+=",?";
dbInsertSQL += ");";
ExecCallBackSQL(dbCreateSQL);
}
CurTableName = fname;

j = 0;NumRecs = dbFile->GetRecordCount();BeginTran();while(j<NumRecs){PrepareSQL(dbInsertSQL);Bind(0,j+1);for(i=0;i<FieldCount;i++){CString str = Trim(dbFile->ReadAttr(j+1,i));switch(dbFile->GetFieldTypeByIndex(i)){case 'C':case 'D':case 'L':{Bind(i+1,(LPCTSTR)str);}break;case 'F':{Bind(i+1,StrToFloat(str));}break;case 'N':{Bind(i+1,StrToInt(str));}break;case 'M':default:break;} }Exec();j++;if (j%1000==0){CommitTran();BeginTran();}}CommitTran();ExecSQL(dbSelectSQL);}delete dbFile;}}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="