欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一种动态组装SQL语句的方法

程序员文章站 2022-06-01 16:31:23
...

举个例子,结构体RankData的结构如下:

struct RankData
{
    unsigned int starnum;
    char starnumtime[21];
    unsigned int poetrynum;
    char poetrynumtime[21];
    unsigned int wordnum;
    char wordnumtime[21];
    unsigned int achievenum;
    char achievenumtime[21];
    unsigned int fforder;
    char ffordertime[21];
    char stuff[0];
    RankData()
    {
        memset(starnumtime, 0, sizeof(starnumtime));
        memset(poetrynumtime, 0, sizeof(poetrynumtime));
        memset(wordnumtime, 0, sizeof(wordnumtime));
        memset(achievenumtime, 0, sizeof(achievenumtime));
        memset(ffordertime, 0, sizeof(ffordertime));
    }
};

现要求实现一个函数

bool CRankList::UpdateRankList(unsigned int accid, const RankData rankdata)

,根据传进来的rankdata来更新数据库,如果xxxnum不等于0则更新数据库中对应的xxxnum以及xxxnumtime字段。

如上所示,结构体中有五个int行的num变量,五个对应的numtime字符串,如果只传了startnum应该只更新数据库中starnum和starnumtime,其余字段不更新,如果五个都传入则五个都更新,这种情况下,如果每种情景都模拟则共有31种情况(全部都不传的情况排除),那这时候再根据不同情况写不同sql语句那就太麻烦了。

这里提供一种动态更新的方法,根据传入的数据不同,生成的sql语句不同。

 char setSql[512] = { 0 };
    char strSql[256] = { 0 };
     //省略若干代码
    memset(setSql, 0, sizeof(setSql));
    strncpy(setSql,"update zone_peotry.rolelist set ",sizeof(setSql) -1);
    if (rankdata.starnum)
    {
        memset(strSql, 0, sizeof(strSql));
        sprintf(strSql, "C_EVENT_INTPARA_0=%d,C_EVENT_INTPARA_0_TIME='%s',", rankdata.starnum, rankdata.starnumtime);
        strcat(setSql,strSql);
    }
    if (rankdata.poetrynum)
    {
        memset(strSql, 0, sizeof(strSql));
        sprintf(strSql, "C_EVENT_INTPARA_1=%d,C_EVENT_INTPARA_1_TIME='%s',", rankdata.poetrynum, rankdata.poetrynumtime);
        strcat(setSql, strSql);
    }
    if (rankdata.wordnum)
    {
        memset(strSql, 0, sizeof(strSql));
        sprintf(strSql, "C_EVENT_INTPARA_2=%d,C_EVENT_INTPARA_2_TIME='%s',", rankdata.wordnum, rankdata.wordnumtime);
        strcat(setSql, strSql);
    }
    if (rankdata.achievenum)
    {
        memset(strSql, 0, sizeof(strSql));
        sprintf(strSql, "C_EVENT_INTPARA_3=%d,C_EVENT_INTPARA_3_TIME='%s',", rankdata.achievenum, rankdata.achievenumtime);
        strcat(setSql, strSql);
    }
    if (rankdata.fforder)
    {
        memset(strSql, 0, sizeof(strSql));
        sprintf(strSql, "C_EVENT_INTPARA_4=%d,C_EVENT_INTPARA_4_TIME='%s',", rankdata.fforder, rankdata.ffordertime);
        strcat(setSql, strSql);
    }
    setSql[strlen(setSql) - 1] = '\0';
    memset(strSql, 0, sizeof(strSql));
    sprintf(strSql, " where C_ACCID=%d;", accid);
    strcat(setSql, strSql);
    if (!rankdata.starnum && !rankdata.poetrynum && !rankdata.wordnum && !rankdata.achievenum && !rankdata.fforder)
    {
        return false;
    }

 

这里的关键是使用了一个辅助数组来实现将字符串给格式化然后拼接到我们想要的字符串后边。