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

  上周看到一篇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","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,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期的炮轰,如今,自己又办了件这样的傻事,预测评论内容会呈现排队阵势……还望小伙伴们手下留情,关注知识,拒绝嘲讽~

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")