源代码路径:
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;
}