首先,自己对数据类型没有足够重视,导致很多次都遇到麻烦,但草草解决之后也没有想如何避免的问题。昨天听完学术交流会,其中考试系统也遇到数据类型的问题,从我多次被迫改动数据库以及代码的感受来说,初期做好数据库规划、从全局上把控各个部分的交互太重要了!
我想从一个错误说起。
选择4号仓,错误如下:
“警告”-查询失败!
选择1号仓,结果如下:
粮仓名称都是从Device表里查出来的,温湿度都是从TempHumi表里查出来的,而且两个表里确定都有数据,同样的操作竟然有不一样的结果??
解析:
提示查询失败就是查询语句不正确,但既然选1号仓能查出结果就证明SQL语句是没有问题的,我想了其中的逻辑和数据都没有问题。最后发现,数据库缺少表!原来我们的粮仓名称统一保存在Device表里,但每一个粮仓名称又需要进行布局等设置,只有设置完成的仓才会有温湿度的表,这个表是动态生成的,表名为TempHumi+粮仓名称,之前没有出错是因为测试太少,1、2号仓是有各种表和数据的,而且我们的项目马上就要结束了,昨天同组的人加了一张表,却没有告诉我,所有被动态生成表的仓全部存储在另一个表里,如果我从这张表里获取粮仓名称就不会出现这种问题了。
第二点是,对于同一问题的处理最好有统一的解决方案。
多人合作又有交互就肯定会出现问题,但不能东边有需求就改东边,西边有错误就顺着西边,在这个四人各据一方的双天平上,东西不一则南北失调,所以要统一改动,改动必须通知。
对于获取粮仓名称来讲,首先我们就需要规范字段,datatable中是用索引还是别名都要提前声明,不统一的后果就是当头的下命令,当兵的三番五次地改。
再如,比较令人头疼的date和time如何处理的问题。
界面上有DateTimePicker,这家伙有好几种表示日期的形式,有兴趣的同学现在动一下手指用搜狗输入法敲“sj”,就可以看到时间的两种表示形式,但都有日期和时间点。当然,我们还有N多种函数可以获取当前时间,N多种数据类型存储数据。但时间格式不统一就是个麻烦事。
最初,我把检测时间“startDate”字段的数据类型设为date,以为在数据库规范一下,不管输入的是什么格式,都转换成date类型存到表中,这样可以减少出错,是最合适的了。
可事实上,它并不是这样的,大家看下图,开始日期的数据类型是date,结束日期的类型是varchar(20)。可以看到,开始日期完整表示是2014/1/25 0:00:00(与后面的开始时间重合,如果不是重合我也不会发现这个问题)。
至此,我没有找到比较合适的数据类型。所以,我采用了Format函数。不管是取日期时间控件的表示值,还是用函数往数据库存时间值,都用Format(Now.Date,"yyyy-MM-dd")规范。不然大家可以看到他们是不一样的,这样去数据库查询数据的后果是什么呢?
Select *from T_Device where testDate='2014/1/25'
“警告”-查询失败!
另外,合作开发小组成员各自负责一部分,但有交互,所以修改要慎重。尽可能在开始设计时考虑充分,比如数据类型,对于交互频繁的地方要规范每个人往数据库写数据时的格式。当然我们无法保证数据库开始就建的合理,所以在发现不合理时,先考虑如何修改改动最少、改正最快,尽可能让少数人修改且最容易修改的人去修改。尽管有时方法名等不太合理,但在保证基本意思的情况下要改接口,而不是改U层N多调用方法的函数名。