一种动态组装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;
}
这里的关键是使用了一个辅助数组来实现将字符串给格式化然后拼接到我们想要的字符串后边。
上一篇: 夏季脱毛当心七雷区 脱毛后更容易晒黑
下一篇: 夏季老犯困怎么办 九个提神方法振奋精神
推荐阅读
-
phpmyadmin里面导入sql语句格式的大量数据的方法
-
Mybatis中的动态SQL语句解析
-
Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)
-
Yii框架在页面输出执行sql语句以方便调试的实现方法
-
浅谈sql语句中GROUP BY 和 HAVING的使用方法
-
用SQL语句查询数据库中某一字段下相同值的记录方法
-
Django shell调试models输出的SQL语句方法
-
两种查看EFCore生成Sql语句的方法
-
thinkPHP框架中执行原生SQL语句的方法
-
关于如何修改一张表中所有行与选定字段的同sql多行语句的添加方法