1 现象:问题描述
在xx产品转侧时候,发现在通过UE创建授权规则时,当数据库中etag字段值为64位的字符串,服务处理逻辑上出错,导致创建规则失败。
2 关键过程:根本原因分析
查看数据库创建及相关表创建的SQL文件,数据库中etag字段的定义为:
etag char(64) null
程序需要定义变量,用于保存从数据库中获得的值;程序对应etag字段而定义的变量为:
TChar pszEtag[64];
最终,使得数据库的字段定义和程序定义之间存在差异:
etag字段最多可以保存64个字符;
pszEtag变量最多只能保存63个字符(64-1,必须存在一个标志字符串结尾的字符);
导致当etag字段保存64个字符时,pszEtag只能从etag获取前面的63个字符,最后一个字符丢失。
3 结论:解决方案及效果
修改变量的定义,将数组pszEtag的尺寸设置为65:
TChar pszEtag[65];
4 经验总结:预防措施和规范建议
需要关注数据库字符串和C++的字符串类型的差异,特别的是当数据库中的字段位定长字段时,注意程序中对应的字段的长度。
5 备注
6 考核点
数据库字符串和C++字符串类型的差异。
7 试题
为了能够从数据库提取某个字符串字段的值到字符串变量,并能够将该字符串变量的值安全保存到数据库,下面对字段的定义和变量的定义方式中,哪种是正确的:
(1)数据库定义的字段: TestField char(33)
程序定义的相关变量 char pszTestField[33];
(2)数据库定义的字段: TestField char(33)
程序定义的相关变量 char pszTestField[32];
(3)数据库定义的字段: TestField char(33)
程序定义的相关变量 char pszTestField[34];
(4)数据库定义的字段: TestField char(100)
程序定义的相关变量 char pszTestField[200]。
答案:(3)
阅读(674) | 评论(0) | 转发(0) |