ymgsc

下次一定赶车
随笔 - 0, 文章 - 1, 评论 - 0, 引用 - 0
数据加载中……

sqlite 方便调用的宏

项目当中用到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; }

posted on 2009-03-26 16:58 又没赶上车 阅读(82) 评论(0)  编辑 收藏 引用 所属分类: C++


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理