既然米老师总结了一下咱的文章风格,那咱是不是要把这风格发扬光大啊~
屌丝大家请脑补头像或者本人脸,至于鸟语嘛。。。等着马上来~
But I can not tolerate this!!!!
Really cannot tolerate this
My Slardar will teach you to be a really man!
My Slardar will teach to be a real man!
Here comes the Clockwerk's hookshot
However hooked nothing!!!!!!!
There are only two teammates
I activated my BKB and blinked in with a crush
Two of enemies are stun but I'm called by Axe.
Kill with Amplify Damage~~~~~
I crush to stun but out of my attack range.
Range Range~out of my attack range!!!!!!
Oh that bastard got Ghost Scepter and Force Staff on himself, and I blink again
kill that motherf【嘟——】cker!!!!! A U V
That sucks, running away
WTF I'm still alive! keep running by activing Mask of Madness and Sprint
Fail to stun
I'm invisible~~~~~
Suck my Magic Stick
jog around and still faster than jugg
Fourth attacking
F【嘟——】cked him with one hit off 300 HP
suck my Magic Stick and eat puck
Madness pppppuck whare are you going??
As you can see, the resent battle, I fucked them in and out, totally 7 times.
that was awesome!!
Sounds interesting~~
But I cannot tolerate this!!!!
How can I tolerate this!!!!!!
My slardar will teach you to be a real man!!!!!
But I cannot tolerate this! How can I tolerate this!!!!
My Slarder will teach you to be a real man~
恩,这下齐了(此处请脑补头像式笑容)
好了,开个玩笑上面那段鸟语大家手动跳过,下面进入正题。
SQLhelper返回实体。
话说这CSDN的编辑器真是难用的一比,最常用的字体都要改半天,直接贴word过来还会不认格式,这玩意是多长时间没维护了。
这要从什么时候说起呢,好久以前记得看谁的博客就说在机房重构中,不让用DataTable这个东西,理由是破坏封装。查SQLhelper的时候,就没发现过有直接返回实体的代码,要不就都是在生成datatable之后把它转化成实体。总感觉SQLhelper返回表,再把表传给D层的类,俩类中间夹了个表怪别扭的,就手动作死把转换代码整合进SQLhelper了。
首先看了看泛型是什么玩意,度娘曰:“泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。”恩,用简单的话说就是动态生成的对象数组,这百度百科都是谁写的。。。
然后习惯性的开始了做死的过程。看了看超哥的博客,里面每一句都写了注释,但还是自己亲手查了一遍,不然用起来不放心啊。
总结一下整个方法的想法:创建一个泛型和一个传入类型的对象,然后等着。传入DataTable,获取传入类型的每一个属性,并存放到一个专门存放属性信息的数组中,对比每一个读取的属性和Datatable表中的列名,并检查是否可写,一切ok之后定义一个临时对象,用来保存属性的值。最后将赋值好的临时对象,赋值给一开始的传入类型对象,写入泛型,之后进入下一个循环。好了,晕了没有?
恩,接下来就是都想看的代码展示啦~
Public Function ExecSelectEntity(Of T As {New})(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As IList(Of T) Dim sqlAdapter As SqlDataAdapter '用来传递数据给dataset Dim ds As New DataSet '用来保存数据 Dim dt As New DataTable '用来读取dataset中的一张表的数据 Dim myList As New List(Of T) '定义返回值集合 Dim myType = GetType(T) '得到实体类的类型 Dim dr As DataRow '定义行集 Dim tmpString As String = String.Empty '定义一个临时的变量,用来存放属性名 '给cmd赋值 cmd.CommandText = cmdText cmd.CommandType = cmdType cmd.Connection = conn cmd.Parameters.AddRange(sqlParams) '参数添加 sqlAdapter = New SqlDataAdapter(cmd) '实例化adapter Try sqlAdapter.Fill(ds) '用adapter将dataSet填充 dt = ds.Tables(0) 'datatable保存dataSet中第一个表的数据 cmd.Parameters.Clear() '清除参数 '遍历Datatable表 For Each dr In dt.Rows Dim myT As New T '定义T类型的对象 Dim Propertys() As PropertyInfo = myT.GetType().GetProperties() '定义属性集合,用来存放得到的T的属性 Dim PInfo As PropertyInfo '定义一个属性类型的变量,读取属性集合中的每个属性 '遍历对象的所有属性 For Each PInfo In Propertys tmpString = PInfo.Name '将属性名赋给临时变量 '检查datatable中的列名是否包含对象的属性名 If (dt.Columns.Contains(tmpString)) Then '判断此属性是否可写,如果不可写,跳出本次循环 If (PInfo.CanWrite = False) Then Continue For End If Dim tmpObj As Object = dr(tmpString) '定义一个对象型的变量来保存列值 If (Convert.ToString(PInfo) <> DBNull.Value.ToString()) Then '如果不为空,赋值给对象的属性 PInfo.SetValue(myT, tmpObj, Nothing) '在运行期间,通过反射,动态的访问一个对象的属性 End If End If Next myList.Add(myT) '添加到集合 Next Return myList '返回泛型 Catch ex As Exception Return Nothing Finally '最后一定要销毁cmd Call CloseCmd(cmd) End Try End Function
返回实体之后的泛型,我理解是这个样子的。(index只是标号,不在泛型中- -)
每一个实体作为一个整体存入泛型的空间中,而表只是读取了每一个实体的属性的值,生成了一个“表格对象”。
这就是我理解的为什么不能传表,至于对不对的。。。先这么着吧。
最后还有一句:小伙伴们赶紧给我指导啊!不然下周博客没得写啦!
以上