项目当中用到sqlite3数据库。
感觉直接用API访问数据库,代码挺难看的。而且考虑到将来有移植到其它数据库的可能性。
所以就定义了几个宏。方便将来移植,而且看上去代码也简洁不少。
最后的代码应该是:
int _tmain(int argc, _TCHAR* argv[])
{
if (db_init())
{
DECLARE_SQL(g_db); //声明一些变量
PREPARE_SQL("select ID, name from TBL_MAGIC where ID = %d" , 1); //数据库访问的SQL语句 里面实际有个循环
MAGIC magic;
SQL_INT(magic.ID);
SQL_TEXT(magic.name, 32);
printf("[%d][%s]\n", magic.ID, magic.name);
FINISH_SQL; //结束表的访问
db_close();
}
return 0;
}
相应的代码文件应该在“本blog的文件当中可以找到”
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面是完整的代码
// study.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include "sqlite3.h"
#pragma comment(lib,"sqlite3.lib")
#define __PACKET_LEN_ (4096)
#define DB_SQL_LEN (1024)
sqlite3* g_db = NULL;
int sprintf_s_1(CHAR **string,UINT& sizeInBytes,const char *fmt,...)
{
char buf[__PACKET_LEN_] = {0};
char* oldstring = *string;
va_list args;
va_start(args, fmt);
vsprintf_s(buf, __PACKET_LEN_, fmt, args);
va_end(args);
int nLen = sprintf_s(oldstring, sizeInBytes, buf);
oldstring += nLen;
*string = oldstring;
sizeInBytes -= nLen;
return nLen;
}
//////////////////////////////////////////////////////////////////////////
//宏定义
#define DECLARE_SQL(__db_) \
sqlite3 *db = NULL; \
sqlite3_stmt * stmt = NULL; \
const char *sztail; \
char sqlcmd[DB_SQL_LEN] = "\0"; \
char* psql = NULL; \
int count; \
UINT uSprintLen; \
int ret; \
db = __db_;
//可变参数的宏
#define PREPARE_SQL(...) \
count = 0; \
ret = -1; \
uSprintLen = DB_SQL_LEN; \
psql = sqlcmd; \
sprintf_s_1(&psql, uSprintLen, __VA_ARGS__); \
sqlite3_prepare(db , sqlcmd , -1 , &stmt , &sztail); \
ret = sqlite3_step(stmt); \
while(ret == SQLITE_ROW) \
{ \
UINT uColIndex = 0;
#define FINISH_SQL \
ret = sqlite3_step(stmt); \
count++; \
} \
sqlite3_finalize(stmt); \
stmt = NULL;
#define SQL_INT(__value_) __value_ = sqlite3_column_int(stmt , uColIndex++);
#define SQL_BOOL(__value_) __value_ = (sqlite3_column_int(stmt , uColIndex++) == 1 ? true : false);
#define SQL_TEXT(__value_, __size_) sprintf_s(__value_ , __size_, "%s" , sqlite3_column_text(stmt , uColIndex++))
////////////////////////////////////////////////////////
struct MAGIC
{
UINT ID;
CHAR name[32];
};
BOOL db_init()
{
int ret = 0;
char szFileName[MAX_PATH];
::GetModuleFileNameA(NULL,szFileName, sizeof(szFileName));
char *pStr = strrchr(szFileName, '\\' );
sprintf_s(pStr + 1,MAX_PATH - (pStr + 1 - szFileName),"%s", "user.db");
ret = sqlite3_open(szFileName, &g_db);
if( ret ){
sqlite3_close(g_db);
g_db = NULL;
return FALSE;
}
return TRUE;
}
BOOL db_close()
{
if(g_db){
sqlite3_close(g_db);
g_db = NULL;
}
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (db_init())
{
DECLARE_SQL(g_db);
PREPARE_SQL("select ID, name from TBL_MAGIC where ID = %d" , 1);
MAGIC magic;
SQL_INT(magic.ID);
SQL_TEXT(magic.name, 32);
printf("[%d][%s]\n", magic.ID, magic.name);
FINISH_SQL;
db_close();
}
return 0;
}
|
文件: | SQLLite 宏.rar | 大小: | 1364KB | 下载: | 下载 |
|
阅读(615) | 评论(0) | 转发(0) |