再转换成List。所以这章主要讲如何完成这两种类型的转换,转换结束之后也是如何调用的。上一篇博客说到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的转换,但
是实际敲代码的时候却遇到了两种转换。不过,通过对两种转换的学习,还是比较深刻的,所以这也算是我的一些小
小收获吧!
原文链接:https://www.f2er.com/vb/257521.html