您的位置:首页 > 编程语言 > VB

VB.net版机房收费系统——Boolean、DataTable和泛型

2016-03-13 19:42 363 查看
  上周看到一篇CSDN博客的下边评论了这样一句话:有一种手贱,叫不小心点了“舍弃”。看到以后,觉得评论者真心有意思~

  本周博客还没发,就在晚饭前,花了一个多小时的时间写博客,最后关头,手很不听使唤地点了“舍弃”,瞬间不想吃饭了,可是转念一想,我需要冷静一下,还是去吃饭吧~当然,由于情绪期初有点激动,泄露了自己的嗅事,被同屋的同学们笑了一通,怪只怪平时不太“积德”,我发誓,从此刻起,再也不损别人了……

  我知道,当读者看完以上内容,就知道这篇博客的评论该怎么写了,即便如此,我还是要强忍着悔恨的泪水,立志写出一篇更好的博客。 

  本篇博客主要讲Boolean、DataTable和泛型,通篇采用对比的风格,结合代码和图片体现自己的理解。

 写作背景

  当我敲七层登录的时候,各层的返回值定义的是Boolean,实现了这个功能以后,觉得应该顺便把和登录有关系的功能都给实现,比如将用户上班的工作记录插入表中(T_Worklog_Info),然后又走了一遍七层,中途出了错,向师德帅请教,被他“狠批”了一顿,原因有二:一是为什么要再走一遍七层,而不是直接在D层的时候就把相应的数据插入表中;二是为什么不注意每一层的返回值类型呢?我用Boolean作返回值是可以判断登录成功,但是却没想过后期功能需不需要用库里里边其他信息,若是需要的话,就得用DataTable或是泛型了。 

  听了他的话,忽然间开窍了,发现自己忽略了全局观,有种瞻前不顾后、竭泽而渔的感觉。 

Boolean

  当我们只需要返回一个结果的时候,例如注册成没成功,用Boolean就够了。如果把U层比作是一个领导,他发出了命令,让各层去执行,最后得到的反馈只需是被告知成没成功、效果如何即可,他不需要下属反馈一个还需要他做最后审核的表格,故此类情况最好不用DataTable作返回值。

 

DataTable和泛型

  上文讲的Boolean类型返回值是不需要返回其他信息的,只需要判断即可。而DataTable和泛型的使用情况和Boolean相反,然而二者对其他要用到的信息的返回形式又是不一样的,下面先展示一下机房重构登录功能的D层代码:

<span style="font-family:KaiTi_GB2312;">Public Class dUserLogin : Implements IDAL.IUserLogin
'实现接口中的SelectUserInfo方法,判断用户名和密码输入的正确性
Public Function SelectUserInfo(UserInfo As Entity.eUserLogin) As List(Of Entity.eUserLogin) Implements IUserLogin.SelectUserInfo
Dim i As Integer
Dim helper As New SqlHelper
Dim cmdType As CommandType = New CommandType()
Dim paras As SqlParameter() = {New SqlParameter("@UserName", UserInfo.UserID), New SqlParameter("@PassWord", UserInfo.PassWord)}
Dim cmdText As String
cmdText = "Select * from T_User_Info where UserID=@UserName And PassWord=@PassWord"
Dim dt As New DataTable
dt = helper.ExecSelect(cmdText, CommandType.Text, paras)

'DataTable转泛型
Dim mylist As List(Of Entity.eUserLogin)
mylist = ConvertToList.ConvertToList(Of Entity.eUserLogin)(dt)
'如果返回的泛型mylist中有记录,即用户名和密码输入正确
If mylist.Count <> 0 Then
Dim Worklog As New Entity.eWorklog
'用DataTable作返回类型,需要某些返回字段的时候如下写:
'Worklog.UserID = dt.Rows(0)(1)
'将DataTable转化为泛型作返回类型,需要某些返回字段的时候如下写:
Worklog.UserID = mylist(i).UserID
Worklog.UserName = mylist(i).UserName
Worklog.UserLevel = mylist(i).UserLevel
Worklog.LoginDate = Format(Now, "yyyy-MM-dd")
Worklog.LoginTime = Format(Now, "HH:mm:ss")
Worklog.Computer = System.Net.Dns.GetHostName().ToString()
Worklog.IsWork = "Y"
'**********************************************
'添加上机工作记录
Dim parasAdd As SqlParameter() = {New SqlParameter("@UserID", mylist(i).UserID), New SqlParameter("@UserName", mylist(i).UserName), _
New SqlParameter("@Level", mylist(i).UserLevel), New SqlParameter("@LoginDate", Format(Now, "yyyy-MM-dd")), _
New SqlParameter("@LoginTime", Format(Now, "HH:mm:ss")), New SqlParameter("@PCname", System.Net.Dns.GetHostName().ToString()), _
New SqlParameter("@IsWork", "Y")}
Dim cmdTextAdd As String
cmdTextAdd = "insert into T_Worklog_Info(UserID,UserName,UserLevel,LoginDate,LoginTime,Computer,IsWork)values(@UserID,@UserName,@Level,@LoginDate,@LoginTime,@PCname,@IsWork)"
Dim dtAdd As Integer
dtAdd = helper.ExecAddDelUpdate(cmdTextAdd, CommandType.Text, parasAdd)
Return mylist
'**********************************************
Else
Return mylist
End If
Return mylist
End Function
End Class</span>
  利用断点调试,可以看出用DataTable做返回类型返回的是一张表,如下:



  点击了DataTable Visualizer得到下表:



 

  若是用泛型将得到的DataTable进行转化,得到的是一个“实体”。这就不得不提,泛型的本质就是实体,此处对它先不做过多理解,本文最后会做总结。以下是断点调试,将断点停留在泛型时的状态:



 

  综上所述,DataTable和泛型最大的不同在于泛型更好的体现了面向对象的思想,从库中查询的相关信息若是想要利用,DataTable需要是知道是哪行哪列,而泛型用数据的字段名来代替,能用转化得到的实体“点”出来,如下:


 

总结

  Boolean:我只想要一个判断结果,至于过程,交给别人去做。

  DataTable:我不光要一个验证结果,还要和该结果有关的其他信息,且返回的信息必须以表格的形式反馈给我,根据需要去某一行或是某一列去找。

  泛型:“打包思想”的完美体现—— U层实例化的“包裹式”实体承载着需要验证的信息,途径各个“站点”,最后到达了D层,D层将信息给了数据库,数据库验证成功后,返给D层一张DataTable,D层秉承着礼尚往来,投桃报李的优良品性,见这张DataTable利用泛型思想“打包”成一个实体返回,省去了其他“站点”分行分列地定位挑选信息的麻烦,“点”出想要的信息的字段名即可。

感受

  总结Boolean、DataTable和泛型的时候,对七层重构又有了新的理解:一曰承上启下、上传下达、整齐划一,从各层返回值类型就可以看出;二者负反馈思想的完美体现,一去一回,有来有往。

 

结束语

  虽然上一篇博客不小心点了“舍弃”,然而我相信这篇博客的还原率还是很高的。年终总结的时候,结尾说了句新的一年希望自己变得淑女,遭到了几乎整个12期的炮轰,如今,自己又办了件这样的傻事,预测评论内容会呈现排队阵势……还望小伙伴们手下留情,关注知识,拒绝嘲讽~

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: