mysql中更新(update)blob字段

        mysql_stmt_init() 通过将问号字符“?”嵌入到SQL字符串的恰当位置,应用程序可包含SQL语句中的一个或多个参数标记符。标记符仅在SQL语句中的特定位置时才是合法的。例如,它可以在INSERT语句的VALUES()列表中(为行指定列值),或与WHERE子句中某列的比较部分(用以指定比较值)。但是,对于ID(例如表名或列名),不允许使用它们,不允许指定二进制操作符(如等于号“=”)的 操作数。后一个限制是有必要的,原因在于,无法确定参数类型。一般而言,参数仅在DML( 数据操作语言)语句中才是合法的,在DDL( 数据定义语言)语句中不合法。执行语句之前,必须使用mysql_stmt_bind_param(),将参数标记符与应用程序 变量绑定在一起。从上面可以看出使用"update 表名 set 字段 = ? where uin = x"时期中的问号是不合法的,可以在预处理中使用存储过程"call UpdatePrivatePropsInfo(nUin,  ?)"该存储过程的过程体:
begin
update 表名 set 待更新字段 = value where uin = x;
end
】 
注意:如果待更新字段是二进制数据块类型(如:blob)需要区分平台,开发测试在windows下使用的mysql(version 5.5.20 InnoDB)发布在centos linux下使用的mysql (version 5.1.69)
方式一:简单数据操作语句----这种方式在两个平台都有效


 mysql_real_escape_string (&m_stLDBLink.stMysqlConn.stMysql, szChunk, (const char*)szTempBuffer, nPropBufferLen);

 sprintf( m_stLDBLink.sQuery, "update privatepropsinfo set propsbuffer = '%s' where uin = %llu and gametype = %d", szChunk, iUin, nGameType);

TLib_DB_ExecSQL( &m_stLDBLink, sErrMsg );(内部封装的函数---->执行sql语句)

先将二进制流转换为字符串,因为在执行sql语句时,程序会以字符串结束符作为sql语句的结束标志,然后再调用函数执行sql语句。

方式二:使用存储过程----在windows下没有生效

if ((stmt = mysql_stmt_init (&m_stLDBLink.pstCurMysqlConn->stMysql)) == NULL)
 {
  TLib_Log_LogMsg ("mysql_stmt_init() failed.\n");
  return -1;
 }

 snprintf (strSql, 2047, "call UpdateGamePoints(%llu,%d,%d,%d,%d,%d,%d,?)",
  iUin, nGameType, pstGameCfg->m_gameInfo.m_iPoints,
  pstGameCfg->m_gameInfo.m_iWinNum,
  pstGameCfg->m_gameInfo.m_iLossNum,
  pstGameCfg->m_gameInfo.m_iEqualNum,
  pstGameCfg->m_gameInfo.m_iEscNum);

 if (mysql_stmt_prepare (stmt, strSql, (unsigned long) strlen (strSql)) != 0)
 {
  TLib_Log_LogMsg ("mysql_stmt_prepare failed!\n");
  mysql_stmt_close (stmt);
  stmt = NULL;

  return -1;
 }

 unsigned long len_content = nMedalLen;
 bind[0].buffer_type = FIELD_TYPE_BLOB;
 bind[0].buffer  = pstGameCfg->m_byMedal;
 bind[0].buffer_length = nMedalLen;
 bind[0].length  = &len_content;

 if (mysql_stmt_bind_param (stmt, bind) != 0)
 {
  TLib_Log_LogMsg ("mysql_stmt_bind_param failed!\n");

  mysql_stmt_close (stmt);
  stmt = NULL;

  return -1;
 }

 if (mysql_stmt_execute (stmt) != 0)
 {
  TLib_Log_LogMsg ("mysql_stmt_execute () failed!\n");
  mysql_stmt_close (stmt);
  stmt = NULL;

  return -1;
 }

 mysql_stmt_close (stmt);
 stmt = NULL;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值