去年的時候,師哥師姐們用的是Datatable,也都實現了三層,在網上查了壹些小Dome,也都是datatable ,於是我們就會發現這樣真的有意義嗎。
那麽我們先來看看Datatable和Dataset吧。在CSDN上,他說的是內存中的壹張表,其實我們也可以直接把Datatable認定為數據庫中查出來的表,比如妳要查學生信息,那麽學生信息表在電腦上就是我們說的Datatable。而Dataset在CSDN中解釋為 DataSet 是數據的壹種內存駐留表示形式,無論它包含的數據來自什麽數據源,都會提供壹致的關系編程模型。 DataSet 表示整個數據集,其中包含對數據進行包含、排序和約束的表以及表間的關系。 那麽我們把他理解成壹個內存中的數據庫吧,存放多個表的地方,也就是由多個Datatable的集合,壹個小型數據庫。
也就是說我們在層與層之間用的如果是Datatable,也就是數據庫中的表,但是在我們三層的實現中,我們裏邊的結構其實只有UI層,BLL層,DAL層,Entity層,並沒有要說到的Datatable的地位,知識我們在這樣查詢的時候方便罷了。
但是這樣的話,我們的實體層貌似就沒什麽用了,尤其是查詢的時候,我們的目的是查詢東西,然後顯示出來,可是如果顯示的是Datatable,那麽就把實體層架空了。
然後我們再說說實體Entity和List,單個實體如果比喻成壹個學生的話,那麽List就是好多的學生,但是前提是都是學生。Entity是壹維的,而datatable是二維的,如果大家不明白,那就把實體理解成壹條線,而Datatable理解成壹張表。實體本身也就是壹些對象的具體屬性的集合。把Datatable中列的屬性壹次在實體中體現出來。
那麽為什麽要這麽做呢,為什麽要把查到的結果再轉化壹下。我們做系統的時候當然是往好的方面做,但是我們思考的時候卻要往最壞的地方去考慮:這個系統不會壹次做好的, 這個系統還是要改,這個系統我需要好多人來幫我,這個系統還不完善,當我們提出來這些“壞”的考慮時,我們就會發現,如果我們返回的是Datatable,要改?怎麽改,我看不到Datatable裏邊的信息啊,完了,還得找數據庫。如果我需要別人幫我,完了,別人也不知道Datatable裏邊是什麽,還得看數據庫,如果以後我需要修改怎麽辦,時間長了呀,都忘了,還得找數據庫。
那麽大家是不是發現,只要是改動,那麽我門需要的就是數據庫,把核心數據都暴露了,這怎麽可以,所以我們的前輩才發明了實體這麽壹個東西。
前邊已經說過,我們為什麽不用Datatable了,即使他在實現的時候是比較簡單,但是我們還是要轉化,現在我就展示壹下他們是如何轉化。
如果我們查詢的是單條數據,那麽就把Datatable轉化到實體中。dStudent為該次轉化的實體
<span style="font-size:14px;"><span style="font-size:14px;"> '如果查詢道德表的列數不為0,則把需要的查詢到的列的數據傳給student實體
If table.Rows.Count<> 0 Then
dStudent.Student_No = table.Rows(0).Item("Student_No")
dStudent.Student_Name =table.Rows(0).Item("Student_Name")
dStudent.Sex = table.Rows(0).Item("Sex")
dStudent.Department =table.Rows(0).Item("Department")
dStudent.Grade =table.Rows(0).Item("Grade")
dStudent.StuClass =table.Rows(0).Item("StuClass")
dStudent.IsExist =table.Rows(0).Item("IsExist")
dStudent.Charge =table.Rows(0).Item("Charge")
dStudent.Card_ID =table.Rows(0).Item("Card_ID")
End If
'返回實體Student
Return dStudent
</span></span>
這樣我們在以後的使用中,無論是修改,還是讓別人來看,都是方便的很多。
而List的方法也是非常的方便,知識把Datatable裏邊的屬性遍歷了壹邊,然後在給List(T)中,當然首先添加壹個方法,以後直接調用該方法,就成成功的轉化。
<span style="font-size:14px;"><span style="font-size:14px;"> Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T) '將datatable轉化為泛型集合
'註意:1,convertToList(Of T As {New}) 這裏的new是用來約束T的,必須有,不然new T的時候會出現錯誤
'2,new約束在C#和VB.NET裏面的寫法是不壹樣的,C#裏面用的是where來為T加上約束的
Dim myList As New List(Of T) '定義最終返回的集合
Dim myTpye As Type = GetType(T) '得到實體類的類型名
Dim dr As DataRow '定義行集
Dim tempName 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
tempName = Pr.Name '將屬性名稱賦值給臨時變量
'檢查DataTable是否包含此列(列名==對象的屬性名)
If(dt.Columns.Contains(tempName)) Then '將此屬性與datatable裏的列明比較,查看datatable是否包含此屬性
'判斷此屬性是否有Setter
If (Pr.CanWrite = False) Then '判斷此屬性是否可寫,如果不可寫,跳出本次循環
Continue For
End If
Dim value As Object =Trim(dr(tempName).ToString) '定義壹個對象型的變量來保存列的值
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</span></span>
實現的時候我們只需要加上壹句
<span style="font-size:14px;"><span style="font-size:14px;">myList= EntityHelper.convertToList(Of Entity.CancelCardEntity)(table)
Return myList</span></span>
實體,實體集,Datatable三者的比較,用好了,靈活性壹定會得到很大的提高,那麽以後的學習中,是不是也應該考慮壹下,為什麽要這麽做,不這麽做會怎麽樣。