DataTable转化为泛型集合
2014-11-02 20:59
337 查看
前一段时间,因为做机房重构基本思路都没有搞清楚,然后周围接触的概念太多了,就想一开始什么都加上,不堪重负,起步很慢。后来经亮哥提点,一点一点的加东西,就好很多了。 对于泛型集合,前面有很多男神女神已经写的很详细了。但是知识自己总结的才能算是印脑子里了。我就写写自己的理解吧。 看完关于泛型集合的相关资料(博客、设计模式、网上其他一些介绍。。。),理一理思路:是什么? [泛型是具有占位符(类型参数)的类、结构、接口和方法。这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。 泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。]——MSDN 泛型集合其实就是一个个的实体类集合,我们在没有接触这个概念前,数据库访问返回的类型有实体、DataTable、Boolean。下面是画了几张示意图:![](http://img.blog.csdn.net/20141102203831949?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWF5Zmxh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20141102203911495?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWF5Zmxh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20141102204046125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWF5Zmxh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
怎么用? 首先明白DataTable转化为泛型集合就是在转化类中写了一个转化方法,写好之后在D层实例化该类的返回类型。
<span style="font-size:18px;">D层</span>
<span style="font-size:18px;">Imports System.DataImports System.Data.SqlClientImports EntityPublic Class AddDeleteDAL Public Function SelectDAL(ByVal SUserInfo As Entity.Users) As Entity.Users '查询表 Dim SU As New Entity.Users '定义实体类 '连接数据库读取数据,为DataGridView赋值 Dim conn As New SqlConnection '定义连接数据库 Dim cmd As New SqlCommand '定义数据库命令 Dim dt As New DataTable conn = New SqlConnection(SQLUtil.connstring()) '实例化SQLUntil中返回的字符串, cmd.Connection = conn '为字符串赋值 '查询字符串 cmd.CommandText = "Select * From T_Users Where Level=@Level" cmd.Parameters.Add(New SqlParameter("@Level", SUserInfo.Level)) cmd.CommandType = CommandType.Text conn.Open() '打开数据库 Dim ds As New DataSet '定义一个dataset Dim da As New SqlDataAdapter '定义一个sqldataadapter ,dataset和sql sever的桥梁 da.SelectCommand = cmd '填充dataset 'da.Fill(ds) da.Fill(ds, "Userinfo") dt = ds.Tables("Userinfo") 'Select Case conn.Close() Return dt '返回值 End Function</span>有哪些好处? 如果不用泛型集合,你要是查询有多少个用户的时候(添加删除用户),单个实体和Boolean肯定是不行的,DataTable倒是可以,可以把但是它因为高耦合(一个用户信息变化,就得修改DataTable),使系统运行的性能会不好.
Imports System.Collections.Generic '增加泛型的命名空间Imports System.Reflection '反射Public Class GetGenerics '将DataTable转化为泛型集合会降低耦合度 Public Shared Function ConvertToList(Of T As {New})(DataTable As DataTable) As IList(Of T) 'ConvertToList(Of T As {New}) 这里的New是用来约束T的,必须有,不然New T的时候会出现错误 '实例化最终返回的实体集合 Dim myList As New List(Of T) '得到实体类的类型名 Dim myType As Type = GetType(T) 'Dim myType As Type 'myType = GetType(T) '定义行集 Dim DataRow As DataRow '定义一个临时变量 Dim TmpName As String = String.Empty '遍历DataTable的所有数据行 For Each DataRow In DataTable.Rows '定义一个实体类的对象 Dim myT As New T '定义属性集合 Dim propertys() As PropertyInfo = myT.GetType().GetProperties() '定义一个对象pr Dim pr As PropertyInfo '遍历该对象的所有属性 For Each pr In propertys TmpName = pr.Name '将属性名称赋值给临时变量 '检查DataTable是否包含此列(列名==对象的属性名) If (DataTable.Columns.Contains(TmpName)) Then '将此属性与DataTable里的列名比较,查看DataTable是否包含此属性 '判断此属性是否有Setter(类) If (pr.CanWrite = False) Then '判断此属性是否可写,如果不可写,跳出本次循环,进入下一次循环;exit for 是退出整个循环 Continue For End If Dim value As Object = DataRow(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 FunctionEnd ClassD层代码:
<span style="font-size:18px;">Public Class AddDeleteDAL Public Function SelectDAL(ByVal SUserInfo As Entity.Users) As List(Of Entity.Users) '查询表 Dim SU As New Entity.Users '定义实体类 '连接数据库读取数据,为DataGridView赋值 Dim conn As New SqlConnection '定义连接数据库 Dim cmd As New SqlCommand '定义数据库命令 Dim dt As New DataTable conn = New SqlConnection(SQLUtil.connstring()) '实例化SQLUntil中返回的字符串, cmd.Connection = conn '为字符串赋值 '查询字符串 cmd.CommandText = "Select * From T_Users Where Level=@Level cmd.Parameters.Add(New SqlParameter("@Level", SUserInfo.Level)) cmd.CommandType = CommandType.Text conn.Open() '打开数据库 Dim ds As New DataSet '定义一个dataset Dim da As New SqlDataAdapter '定义一个sqldataadapter ,dataset和sql sever的桥梁 da.SelectCommand = cmd '填充dataset 'da.Fill(ds) da.Fill(ds, "Userinfo") dt = ds.Tables("Userinfo") </span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>Dim mylist As New List(Of Entity.Users) mylist = GetGenerics.ConvertToList(Of Entity.Users)(dt)</span>
<span style="font-size:18px;"> conn.Close() Return mylist '返回值 End Function</span>最后返回的值就是泛型集合了。 在这个学习过程中,我感受很多,由浅入深,一点一滴的积累,厚积薄发。 有很多理解有误的地方,希望各位帅哥美女们给指点指点。
相关文章推荐
- 机房重构----C#中将DataTable类型转化为泛型集合
- C# 将list<>泛型集合 转化为 DataTable
- C#中将DataTable类型转化为泛型集合
- 再谈怎样以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式
- 【个人重构】如何将DataTable转化成泛型
- 三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)
- List转DataTable(反射) ; 将泛型集合类转换成DataTable ; 将集合类转换成DataTable
- DataTable、实体类Model和泛型List之间的转化
- DataTable填充实体类返回泛型集合
- 泛型List转化为DataTable
- DataSet、DataTable转换List(泛型集合与DataSet互相转换 )
- DataTable填充实体类返回泛型集合
- 将泛型集合类(List<T>)转换成DataTable,返回的DataTable所有列的数据类型为string型,且列顺序与字符串提供的字段顺序一致
- 使用泛型集合代替datatable作为返回值实现面向对象
- 将DataTable转换成List<T>泛型集合助手类
- 将N层集合对象自动转化为对应的.NET泛型对象(C++)
- 使用泛型集合取代datatable作为返回值实现面向对象
- 将一个DataTable转换成一个List<T>的泛型集合
- DataTable转换泛型集合 实体类
- C#中DataTable与泛型集合互转(支持泛型集合中对象包含枚举)