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
- CRecordsetBindObject优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 优化
- 你的程序会崩溃吗?
- 由JQuery到Angularjs的思维转变
- 从其它机器把collections拷到本机
- Netbeans 计算器设计
- 数组名和指针的区别
- CRecordsetBindObject优化
- 优先队列(利用二叉堆实现)
- 重造轮子-最小栈
- PopupWindow的特殊情况
- PHP防止SQL注入自带函数分析
- ListView和EditText发布帖子隐藏软键盘
- NYOJ 949 哈利波特
- STM32 USART 输入输出C库函数重定向理解
- emacs常见变量和函数【转载】