Datatable和實體還有實體集List的差別與轉化
機房收費系統大家想必不是做完。就是已經在手上了,在一開始做的時候就明白規定。我們必須用實體。而不能使Datatable,由於說是Datatable直接面向了數據庫,當時不是非常明白,於是也沒有再深究,就去實現代碼部分了。如今最終把三層的機房收費系統做完了,回過頭再看的時候,有了那麽一點小認識。
去年的時候,師哥師姐們用的是Datatable。也都實現了三層。在網上查了一些小Dome。也都是datatable ,於是我們就會發現這樣真的有意義嗎。
那麽我們先來看看Datatable和Dataset吧。
在CSDN上,他說的是內存中的一張表,事實上我們也能夠直接把Datatable認定為數據庫中查出來的表。比方你要查學生信息,那麽學生信息表在電腦上就是我們說的Datatable。而Dataset在CSDN中解釋為
也就是說我們在層與層之間用的假設是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三者的比較,用好了。靈活性一定會得到非常大的提高,那麽以後的學習中,是不是也應該考慮一下,為什麽要這麽做。不這麽做會怎麽樣。
Datatable和實體還有實體集List的差別與轉化