做数据处理程序的程序员一定都很烦数据库的数据类型和开发语言数据类型的不一致问题(使用ORM的情况除外)。
当然这个问题也一定程度上是数据库设计的欠缺造成的。现在举个例子来讲一下如.NET中如何通过DataBinding来提高程序开发中的转换效率,相信如下的情景一定有很多人遇到过。
问题描述:数据中的日期型字段设置成了String型或者Float型而,程序设计时用的日期选取空间一般用DateTime类型,现在要能够将数据库中取出的日期字段显示在界面上,要求能够做增删改,然后再存入数据库中。为了完成这样的工作要怎么做呢?很多人凭直觉都会说,格式转换呗。是的,格式转换是肯定的,问题是有些应用中当界面上充满各种输入控件时如何高效率的完成转换并使得程序的结构良好,而不是机械的:写Select语句取数据-->解析字段-->逐个控件赋值(转换为显示格式)-->增删改-->逐个控件取值(转换成数据库存储格式)-->写Updata等语句更新数据库呢?这其中还包括界面控件的操作状态控制,比如是否允许前后翻等。按照逐个流程不是实现不了,甚至很多人本身就是这样做的。以至于我们的代码就为了实现基本的数据维护操作而迅速膨胀,不但感觉极其烦琐,而且给后期的需求变更和代码维护带来很多潜在困难。
问题解决:.NET2.0时,还没有怎么推ORM,所以这里不提ORM,前提是数据库已经设计好,需要解决上述问题。实际上.NET2.0中的Binding机制已经能够比较好的解决这一问题。
首先,我们建好自己的业务类,基本每个数据表对应一个类,各字段成为类的属性项目,当然如果不想写类,也可以用.NET用向导生成数据集的DataTable和Adapter。
其次,对于用BindingSource绑定到DataTable类。
再次,将能够直接显示(不需要做转换的)的字段直接绑定到对应的控件,比如TextBox等。这一步可以通过VS环境再设计模式完成,也可以写代码自己绑定。
然后,对于上述中的日期显示问题,通过自己写代码绑定,关键是实现DataBinding类的Parse和Format两个事件委托,将e.Value按照显示或者存储的需要格式转换化后再赋给e.Value即可。MSDN帮助中有详细解释:《Binding.Parse 事件》
http://msdn.microsoft.com/zh-cn/library/system.windows.forms.binding.parse.aspx
最后,对于在存储上为枚举的数字或者编码,而在显示上需要用户从列表描述名称中选取的情况,使用Commbox一类的控件,通过Binding后,分别用SelectedValue和DisplayValue级可以解决,这是属于多值列表绑定。
可以看到通过Data Binding机制只需要写很少的控制代码,通过各种绑定事件,就能很方便实现数据的存储和显示分离和联动,并且用委托事件这类机制较好的降低了界面和逻辑的耦合性,不会出现到处访问界面控件的问题。