对于一个ORM框架来说,实体对象中或说是编程语言中的数据类型最好还是要能和数据库中的数据类型能实现自动的无缝转换,这样的好处是显而易见的,一是使用起来比较简单,减少重复性工作;二是可以充分利用编程语言(尤其是强类型的C#)的类型校验能力,可以显著减少bug。
要实现这个无缝转换,我们要做这么两件事:
1 确定转换点和转换方向;
2 确定要做哪些转换;
确定转换点很简单,就是在数据库的操作点上,也就是增删改查,更具体的就是在Insert/Delete/Update/对象的初始化函数Init_Delegate中。转换方向也很清楚,前三个函数是从c#到数据库,后一个是从数据库到c#。
应当注意的是,c#和数据库之间的数据转换我们只需要考虑简单数据类型就可以了,不需要考虑结构化的数据类型。由于和数据库的交互我们是采用的ado,所以简单的数据类型我们又可以划分为如下几种:
1 数值类型,可以直接拼入sql语句中;
2 字符串、日期、字节数组类型,应通过参数的方式进行传递;
而sql语句的拼接主要发生点在于:
Insert:主要是values子句;
Delete:主要是where子句;
Update:where和set子句;
Select:主要是where子句;
在这些子句中,我们首先要判断数据类型,然后选择是直接拼入相应子句,还是拼入参数,然后在对参数进行赋值。
从c#到数据库的转换,数值类型和字符串、日期类型都比较好处理,需要进行特殊处理的有:
1、bool型稍麻烦点:要根据其值的真假先转换为1/0,然后再传递;
2、枚举类型要先根据基类型也转换为相应的数值,然后再传递;
3、现在xml用的越来越多,所以也要能支持,要将其先转换为字节数组,然后再传递。
反过来,从数据库到c#的转换也就是上面的逆过程,由于c#在从数据库读取数据时,已经按数据库中定义的存储数据的各列的数据类型将其转换为了对应c#中的数据类型,所以我们其实只要关心刚才列举的bool、枚举、xml这三类就可以了:
1、bool比较简单,判断一下数据是否等于1就可以了;
2、枚举比较麻烦,要识别出目标类型是枚举类型,然后进行相应的转换;
3、xml就是将字节数组反向转换回来。