Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108020
  • 博文数量: 2
  • 博客积分: 120
  • 博客等级: 入伍新兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-26 17:04
文章分类

全部博文(2)

文章存档

2009年(2)

我的朋友
最近访客

分类:

2009-03-26 17:04:19

项目当中用到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) |
0

上一篇:没有了

下一篇:利用宏自动生成代码

给主人留下些什么吧!~~