1. 程式人生 > >Datatable和實體還有實體集List的差別與轉化

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

數據 電腦 func 模型 setvalue datarow contains dst 就會

機房收費系統大家想必不是做完。就是已經在手上了,在一開始做的時候就明白規定。我們必須用實體。而不能使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三者的比較,用好了。靈活性一定會得到非常大的提高,那麽以後的學習中,是不是也應該考慮一下,為什麽要這麽做。不這麽做會怎麽樣。


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