當前位置:編程學習大全網 - 腳本源碼 - Datatable和實體還有實體集List的區別與轉化

Datatable和實體還有實體集List的區別與轉化

機房收費系統大家想必不是做完,就是已經在手上了,在壹開始做的時候就明確規定,我們必須用實體,而不能使Datatable,因為說是Datatable直接面向了數據庫,當時不是很明白,於是也沒有再深究,就去實現代碼部分了,現在終於把三層的機房收費系統做完了,回過頭再看的時候,有了那麽壹點小認識。

去年的時候,師哥師姐們用的是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三者的比較,用好了,靈活性壹定會得到很大的提高,那麽以後的學習中,是不是也應該考慮壹下,為什麽要這麽做,不這麽做會怎麽樣。

  • 上一篇:玫瑰花戒指怎麽折
  • 下一篇:紅白機的坦克大戰怎麽調30個命
  • copyright 2024編程學習大全網