【机房收费系统】泛型与Datatable

【引言】

机房收费系统中我们涉及到许多对表的操作,我们会经常用到泛型或是datatable,这两者有相似有优点,也有不同的缺点。

【泛型】

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

在机房收费系统中,我们主要是利用泛型来将datatable转换成实体类,以方便我们的使用。

Imports System.Collections.Generic '添加泛型的命名空间
Imports System.Reflection '引入反射:为了使用propertyInfo
Public Class Generics
    Public Shared Function converToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)

        Dim myList As New List(Of T)    '定义最终返回的集合
        Dim myType As Type = GetType(T)   '得到实体类的类型名

        Dim dr As DataRow   '定义行集

        Dim TmpName As String = String.Empty    '定义一个临时变量

        '遍历datatable的所有数据行
        For Each dr In dt.Rows
            Dim myT As New T   '定义一个实体类的对象
            Dim propertys() As PropertyInfo = myT.GetType().GetProperties()   '定义属性集合
            Dim pr As PropertyInfo
            '遍历该对象的所有属性
            For Each pr In propertys
                TmpName = pr.Name   '将属性名称赋值给全局变量

                '检查datatable是否包含此列,(列名==对象的属性名)
                If (dt.Columns.Contains(TmpName)) Then  '将此属性与datatable里的列名比较,查看datatable是否包含此属性
                    '判断此属性是否有setter(类)
                    If (pr.CanWrite = False) Then '判断此属性是否可写,如果不可写,跳出此循环
                        Continue For
                    End If
                    Dim value As Object = dr(TmpName) '定义一个对象型的列来保存列的值

                    If (value.ToString <> DBNull.Value.ToString()) Then     '判断是否为空,如果非空,则赋给对象的属性
                        pr.SetValue(myT, value, Nothing)     '在运行期间通过反射,动态的访问一个动态的属性
                    End If
                End If
            Next
            myList.Add(myT)   '添加到集合
        Next
        Return myList   '返回实体集合
    End Function
End Class

但是使用泛型,我们要有一些注意的问题,如,实体层里的实体命名必须要与数据库里的字段命名一样,甚至是一些属性也要一样。如充值里的cash字段,如果数据库了设置成decimal 型就会出错。如下图:

                  【机房收费系统】泛型与Datatable_第1张图片

【Datatable】

  datatable的使用没有泛型集合的命名、字段类型限制,但是在u层调用数据库里的参数的时候,我们要把代码写成与数据库字段相对应的列,这样也是稍微不小心也会把参数传错。

txtStudentNo.Text = dt.Rows(0).Item(2)  
txtName.Text = dt.Rows(0).Item(3)  
txtSex.Text = dt.Rows(0).Item(4)  
txtTie.Text = dt.Rows(0).Item(5)  
txtGrade.Text = dt.Rows(0).Item(6)  
txtClass.Text = dt.Rows(0).Item(7)  

而泛型则不用担心这个问题

txtStudentNo.Text = dt(0).StudentNo  
txtName.Text = dt(0).StudentName  
txtSex.Text = dt(0).Sex  
txtStatus.Text = dt(0).Status  
txtGrade.Text = dt(0).Grade  
txtBalance.Text = dt(0).Cash  

在与datagridview交互的过程中,它们的使用都是一样直接赋值即可。

你可能感兴趣的:(【机房收费系统】泛型与Datatable)