﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ymgsc-文章分类-C++</title><link>http://www.cppblog.com/ymgsc/category/9960.html</link><description>下次一定赶车</description><language>zh-cn</language><lastBuildDate>Wed, 01 Jul 2009 10:11:00 GMT</lastBuildDate><pubDate>Wed, 01 Jul 2009 10:11:00 GMT</pubDate><ttl>60</ttl><item><title>sqlite 方便调用的宏</title><link>http://www.cppblog.com/ymgsc/articles/77960.html</link><dc:creator>又没赶上车</dc:creator><author>又没赶上车</author><pubDate>Thu, 26 Mar 2009 08:58:00 GMT</pubDate><guid>http://www.cppblog.com/ymgsc/articles/77960.html</guid><wfw:comment>http://www.cppblog.com/ymgsc/comments/77960.html</wfw:comment><comments>http://www.cppblog.com/ymgsc/articles/77960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ymgsc/comments/commentRss/77960.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ymgsc/services/trackbacks/77960.html</trackback:ping><description><![CDATA[ 项目当中用到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;
}


相应的代码文件应该在&#8220;本blog的文件当中可以找到&#8221;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面是完整的代码





 // study.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#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;
}

 <img src ="http://www.cppblog.com/ymgsc/aggbug/77960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ymgsc/" target="_blank">又没赶上车</a> 2009-03-26 16:58 <a href="http://www.cppblog.com/ymgsc/articles/77960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>