CRecordsetBindObject优化

来源:互联网 发布:证大财富淘宝贷款骗局 编辑:程序博客网 时间:2024/06/06 13:59

在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));



0 0