CRecordsetBindObject优化


在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值