基于VC2008的sqlite3的例子程序

源代码路径:

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;
}

 

 

你可能感兴趣的:(数据库,VC,utf8,sqlite3,CString)