在机房重构的时候我们都会将数据库的数据读取出来,经常使用的是就是DataTable数据类型,将数据库中表的信息读取出来,存在临时数据表中,即DataTable表,然后将在其他层中需要数据传参的就直接将方法定义为DataTable类型的(除非有特殊要求)。而另一种存储数据的方式就泛型集合,将DataTable转换成泛型,然后通过泛型再去传递数据。
我从网上查了一些关于他们两个的不同:
DataTable的数据改动需要根据数据库表中的信息操作,例如,如果我想将数据库某表的某个新字段读取出来,那么用DataTable需要重新查看数据库,然后间接就将数据库中的信息暴露了,除非是同一个人操作,不过那样岂不是不灵活了。
同样的,问题,使用泛型集合,则不需要。 泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法存储或者使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型或其方法的参数类型出现。泛型的方法还可以将参数类型用作返回值类型或者某个形参的类型。
但是我根据我自己的代码,表示没理解他们直接到底有什么不同,及时不用泛型,我也可以将数据源存到DataTable,然后方法返回值也定义为DataTable型也就没事了。而我用的泛型,除了将返回值方法定义为泛型,我也没有看出有什么不同,可能是我还没有发现不同吧,表示很纠结………
如果使用了泛型,那肯定需要有DataTable转换成泛型的算法,如下:
Public Class ConvertList
Public Shared Function ConvertToList(Of turn As {New})(ByVal table As DataTable) As List(Of turn)
'new 用来约束
Dim list As New List(Of turn) '定义最终返回的集合
Dim type As Type = GetType(turn) '得到实体类的类型名
Dim dr As DataRow '定义行数据
Dim tmpName As String = String.Empty '定义一个临时变量
For Each dr In table.Rows '遍历datatable表的所有数据行
Dim myturn As New turn
Dim propertys() As PropertyInfo = myturn.GetType().GetProperties '定义属性集合, 获得此模型的公共属性
Dim pr As PropertyInfo '定义属性并提供属性访问
For Each pr In propertys '遍历该对象的所有属性
tmpName = pr.Name '将属性名称赋值给临时变量
If (table.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(myturn, value, Nothing) '在运行期间通过反射,动态的访问一个对象的属性
End If
End If
Next
list.Add(myturn) '对象添加到泛型集合
Next
Return list
End Function
End Class