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的转换,但