基于VC2008的sqlite3的例子程序

来源(博客频道 - CSDN.NET)

From: http://blog.csdn.net/songly1/article/details/16826655

基于VC2008的sqlite3的例子程序

标签: VCsqlite3 数据库 utf8 cstring

2013-11-19 16:35 2556人阅读

版权声明:本文为博主原创文章,未经博主允许不得转载。

源代码路径:

http://download.csdn.net/detail/songly1/6576447

写这个的原因在于最近在找工作,一时找不到合适的,投了很多公司,而且重复投过,不同网站的。

于是,用sqlite3本地数据库写了一个小程序用于记录已经申请的公司,数据库表格很简单:公司名,申请的网站名,申请时间。

把三个键共同作为复合主键。

1、针对sqlite3编译为一个静态库,再集成到整个应用工程中。感觉方便点。

2、创建的数据库表格如下

create table JobSearch(name varchar(30) not null,netname varchar(20) not null,time datetime not null, PRIMARY KEY(name,netname,time))


查询如下

CString str = _T("select * from jobsearch WHERE name like '%") + m_searchName + _T("%' order by time DESC");


3、针对sqlite3中文存储问题,sqlite3中采用utf8格式,因此在CString与char*转换的时候采用A2W_CP和 W2A_CP,而不是A2W和W2A。

比如:

m_datalist.InsertItem(nCount,_T("序号"));
m_datalist.SetItemText(nCount, 1, A2W_CP((char*)sqlite3_column_text(stmt, 0),CP_UTF8));
m_datalist.SetItemText(nCount, 2, A2W_CP((char*)sqlite3_column_text(stmt, 1),CP_UTF8));
m_datalist.SetItemText(nCount, 3, A2W_CP((char*)sqlite3_column_text(stmt, 2),CP_UTF8));


4、使用sqlitedbviewer.exe工具很有帮助。

5、写了一个类用于sqlite3通讯

头文件内容

#include "sqlite3.h"
#include <process.h>

const LPCTSTR SQLITE_NAME = _T("database.db"); //创建的数据文件名
class CMySqlite
{
public:
	CMySqlite(LPCTSTR sql = SQLITE_NAME);
	~CMySqlite(void);
	int ExecuteSQL(LPCTSTR sql = NULL, sqlite3_stmt **stat = NULL);
	void CloseDB();
private:
	bool OpenDB();
	static void ThreadFunc(PVOID pData);
	int DoSQL();  //可以不用多线程
	HANDLE m_hRead;
	sqlite3 *db;
	LPCTSTR dbName;
	LPCTSTR sqlTemp;
	sqlite3_stmt **ssTemp;
	int nResult;
	// char errormessage[256];
};



cpp文件内容

CMySqlite::CMySqlite(LPCTSTR sql)
:db(NULL),dbName(sql)
,sqlTemp(NULL),ssTemp(NULL),nResult(0)
{
	m_hRead = CreateEvent(NULL, FALSE, FALSE, NULL);
	SetEvent(m_hRead);
	// memset(errormessage,0,sizeof(errormessage));
}

CMySqlite::~CMySqlite(void)
{
	CloseHandle(m_hRead);
}

bool CMySqlite::OpenDB()
{
	CloseDB();
	if(dbName == NULL)
	return false;
	USES_CONVERSION;

	int rc = sqlite3_open(W2A_CP(dbName,CP_UTF8),&db);
	if(rc != SQLITE_OK)
	{
		return false;
	}

	//#if USE_CODE
	//这个是数据加密的,暂时没用
	// rc = sqlite3_key(m_hDB,"mcnair2011",10);
	// if(rc != SQLITE_OK)
	// {
		//  TRACE("ERROR:%s\n",sqlite3_errmsg(m_hDB));
		//  return false;
	// }
	//#endif

	return true;
}

void CMySqlite::CloseDB()
{
	if(db != NULL)
	{
		if(sqlite3_close(db) == SQLITE_OK)
		{
			db = NULL;
		}
	}

}

int CMySqlite::ExecuteSQL(LPCTSTR sql, sqlite3_stmt **stat)
{
	WaitForSingleObject(m_hRead, INFINITE);
	nResult = 0;
	sqlTemp = sql;
	ssTemp = stat;

	HANDLE handle;
	handle = (HANDLE)_beginthread(ThreadFunc, 0, this);

	WaitForSingleObject(handle,INFINITE);
	return nResult;
}

void CMySqlite::ThreadFunc(PVOID pData)
{
	CMySqlite* pThis = (CMySqlite*)pData;
	pThis->DoSQL();
	SetEvent(pThis->m_hRead);
}

int CMySqlite::DoSQL()
{
	LPCTSTR sql = sqlTemp;
	sqlite3_stmt** ss = ssTemp;
	nResult = 0;

	if (!OpenDB())  //打开database
	{
		return -1;
	}

	if (sql == NULL && ss == NULL)//仅判断连接状态
	{
		CloseDB();
		return nResult;
	}

	USES_CONVERSION;

	// char* ch = errormessage;

	if (ss == NULL)  //仅执行命令
	{
		nResult = sqlite3_exec(db,W2A_CP(sql,CP_UTF8),NULL,NULL,NULL/*&ch*/);
		CloseDB();
	}
	else
	{
		sqlite3_prepare(db,W2A_CP(sql,CP_UTF8),-1,ss,0);

	}

	return nResult;
}

Link: http://www.asm32.net/article_details.aspx?id=7110


浏览次数 0 发布时间 2016/10/29 10:06:42 从属分类 VC++ 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | Python | 书签 | ASP.Net书签 | 京ICP备09029108号-1