在2个方面,对CRecordsetBindObject优化:
1.简化绑定,并消除安全隐患
2.类型比较采用数字类型的变量类型编码而不是类型名称串,提高处理速度
目前使用数据库记录对象绑定的用法如下:
CRecordsetBindObject<CPurchase> binder;
binder.BindRecordset(prs);
///< 把Status字段与CPurchase的status_变量绑定
binder.BindField(NEW_FIELD_BIND(CPurchase,ORM_FIELD_TYPE_SHORT,0,status_,"Status"));
上述绑定示例,CPurchase的status_是int,但绑定的是ORM_FIELD_TYPE_SHORT.
这导致如果数据库Status=-1,则status_=65535.
原理如下:
void test() {
short n = -1;
int status = 0;
*(short*)&status = n; ///< 此时,status=65535
}
成员确定的情况下,再指定类型是多余的,而且不安全,也增加编码时的负担,改变变量类型需要修改代码.
早期版本是不需要指定类型的,目前这个版本是当初排查问题的手段.
RecordsetBindObject.h中增加2个宏:
#define NEW_FIELD_BIND1(TYPE,VAR,FLD_NAME) \
new CFieldBind(FLD_NAME,typeid(((TYPE*)0)->VAR).name(),0,OFFSETOF(TYPE,VAR))
#define NEW_FIELD_BIND2(TYPE,VAR,FLD_NAME,SIZE) \
new CFieldBind(FLD_NAME,typeid(((TYPE*)0)->VAR).name(),SIZE,OFFSETOF(TYPE,VAR))
上述绑定修改为:
binder.BindField(NEW_FIELD_BIND1(CPurchase,status_,"Status"));
NEW_FIELD_BIND2仅用于char数组的情况,SIZE参数指定数组大小.如:
binder.BindField(NEW_FIELD_BIND2(CTest,name,"Name",20));