【机房收费系统】——两种类型转换

上一篇博客说到DataTable与List的类型转换,在敲代码的过程中,发现还需要把SqlReader转换成DataTable之后

再转换成List。所以这章主要讲如何完成这两种类型的转换,转换结束之后也是如何调用的。


SQLReader —> DataTable


如下代码是SQLReader向DataTable的具体转换过程:
Public Class En_SqlReaderToDatatable

    Public Shared Function GetTable(ByVal _reader As System.Data.SqlClient.SqlDataReader) As System.Data.DataTable
        '错误处理
        On Error Resume Next

        '返回表的列数据
        Dim _table As System.Data.DataTable = _reader.GetSchemaTable()
        '返回数据表
        Dim _dt As System.Data.DataTable = New System.Data.DataTable()
        '返回表的基本构造
        Dim _dc As System.Data.DataColumn
        '返回表的一行数据
        Dim _row As System.Data.DataRow
        '动态数组实现System.Collections.Ilist接口
        Dim _al As System.Collections.ArrayList = New System.Collections.ArrayList()

        Dim i = 0
        For i = 0 To _table.Rows.Count() - 1 '遍历表的所有行
            _dc = New System.Data.DataColumn() '实例化一个基本表
            If (Not _dt.Columns.Contains(_table.Rows(i)("ColumnName").ToString())) Then '如果表中行数据中不包含“ColumnName”,则进行如下步骤
                _dc.ColumnName = _table.Rows(i)("ColumnName").ToString() '列名称变为“ColumnName”
                _dc.Unique = Convert.ToBoolean(_table.Rows(i)("IsUnique")) '唯一性
                _dc.AllowDBNull = Convert.ToBoolean(_table.Rows(i)("AllowDBNull")) '可以为空
                _dc.ReadOnly = Convert.ToBoolean(_table.Rows(i)("IsReadOnly")) '只读
                _dc.ReadOnly = Convert.ToBoolean(_table.Rows(i)("IsReadOnly"))
                _dc.ReadOnly = Convert.ToBoolean(_table.Rows(i)("IsReadOnly"))
                _dc.ReadOnly = Convert.ToBoolean(_table.Rows(i)("IsReadOnly"))
                _al.Add(_dc.ColumnName) '在列末尾添加数据
                _dt.Columns.Add(_dc) '将获取的列的集合放到System.Data.DataColumnCollection
            End If
        Next
        While _reader.Read() '当前进下一条记录
            _row = _dt.NewRow() '增加新数据行
            For i = 0 To _al.Count '遍历表中所有数据
                _row(CStr(_al(i))) = _reader(CStr(_al(i))) '进行转换
            Next
            _dt.Rows.Add(_row) '获取所有转换后的数据,并放到新表中
        End While
        Return _dt
    End Function

End Class

DataTable -> List


下边是DataTable向List转换的具体代码部分:
Imports System.Collections.Generic '增加泛型的命名空间,管理泛型集合
Imports System.Reflection '加入反射,引用PropertyInfo

Public Class En_TableToList
    '将datatable转化为泛型集合
    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
                    '判断此属性是否有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

具体调用过程


转换过程已经出来了,那么如何调用就很好办了!!拿学生例子来瞅瞅:
Public Function Query_Student(ByVal tstStudent As Entity.En_Student) As List(Of Entity.En_Student)

        Dim sqlstr As String
        sqlstr = "select * from Student_Info where StudentNo='" & tstStudent.studentNo & "'"
        Dim sqlcmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(sqlstr, conn)

        Dim dt As New DataTable '定义查询到的表集
        Dim myList As List(Of Entity.En_Student)

        Dim myReader As SqlDataReader
        myReader = sqlcmd.ExecuteReader()

        '将SQLDataReader类型转换成datatable类型
        dt = Entity.En_SqlReaderToDatatable.GetTable(myReader)
        '再将datatable类型转换成泛型集合list类型
        myList = Entity.En_TableToList.converToList(Of Entity.En_Student)(dt)

        Return myList

    End Function

总结


以上就是具体的类型转换过程了,看大家好像没有用到两种转换,博客上都是说的DataTable向List的转换,但

是实际敲代码的时候却遇到了两种转换。不过,通过对两种转换的学习,还是比较深刻的,所以这也算是我的一些小

小收获吧!

你可能感兴趣的:(设计,VB.NET)