去年兄弟姐妹用Datatable,都實現了三層。我們在互聯網上搜索了壹些小圓頂,它們都是數據表,所以我們會發現這是否真的有意義。
那麽我們先來看看Datatable和Dataset。在CSDN,他談論的是記憶中的壹張桌子。事實上,我們也可以直接將Datatable識別為在數據庫中找到的表。比如妳要查學生信息,那麽電腦上的學生信息表就是我們所說的Datatable。在CSDN,數據集被解釋為數據的內存駐留表示,無論它包含什麽數據源,它都提供了壹致的關系編程模型。數據集代表整個數據集,其中包含包含、排序和約束數據的表以及表之間的關系。那麽我們把它理解為內存數據庫,內存中存儲了多個表,也就是多個Datatable的集合,壹個小型數據庫。
也就是說,如果我們在層間使用Datatable,即數據庫中的表,但在我們的三層實現中,我們內部的結構實際上只有UI層、BLL層、DAL層和實體層,沒有Datatable的狀態可言,因此我們可以通過這種方式方便地查詢知識。
但是在這種情況下,我們的實體層似乎沒有用,特別是在查詢時,我們的目的是查詢事物然後顯示它們,但是如果顯示Datatable,那麽實體層就是開銷。
然後我們來談談實體和列表。如果把單個實體比作壹個學生,那麽列表就是很多學生,但前提是他們都是學生。實體是壹維的,而數據表是二維的。如果您不理解,那麽請將實體理解為壹行,將Datatable理解為壹個表。實體本身是壹些對象的特定屬性的集合。數據表中列的屬性壹次反映在實體中。
那麽為什麽要這樣做呢?為什麽要轉換發現的結果?當然,當我們制定壹個制度時,我們是從好的方面去做的,但當我們思考這個問題時,我們必須想到最壞的地方:這個制度不會壹下子就完成,這個制度仍然需要改變。我需要很多人來幫助我這個系統,這個系統仍然不完善。當我們提出這些“不好”的考慮時,我們會發現如果我們返回Datatable,我們應該更改什麽?怎麽改?我看不到Datatable中的信息。之後,我必須找到數據庫。如果我需要有人幫助我,在那之後,其他人不知道Datatable中有什麽,我必須查看數據庫。如果我將來需要修改它怎麽辦?過了很久,我忘了,我得去找數據庫。
所以妳有沒有發現,只要改變了,我們需要的是數據庫,它暴露了核心數據。怎麽會這樣呢?這就是為什麽我們的前輩發明了實體這種東西。
正如我之前所說,我們為什麽不使用Datatable?即使它實現起來相對簡單,我們仍然需要對它進行轉換。現在我將展示它們是如何轉變的。
如果我們查詢壹條數據,那麽我們將把數據表轉換成壹個實體。DStudent是這種轉變的實體。
& ltspan style =“font-size:14px;”& gt& ltspan style =“font-size:14px;”& gt如果查詢道德表中的列數不為0,則需要查詢的列的數據被傳遞給學生實體。
如果表。行數。計數& lt& gt那就0
學生。Student_No =表。行數(0)。項目(“學生編號”)
學生。學生姓名=表格。行數(0)。項目(“學生姓名”)
學生。性=桌子。行數(0)。項目(“性”)
學生。部門=表格。行數(0)。項目(“部門”)
學生。等級=表。行數(0)。項目(“等級”)
學生。StuClass =table。行數(0)。項目(“StuClass“)
學生。IsExist =table。行數(0)。項目(“IsExist“)
學生。收費=表。行數(0)。項目(“收費”)
學生。Card _ ID =表。行數(0)。項目(“卡標識”)
如果…就會結束
返回實體學生
返回學生
& lt/span>。& lt/span>。
這樣以後我們修改或者讓別人看到就方便多了。
列表法也很方便。Knowledge遍歷Datatable中的屬性,然後當然是先給List(T)添加壹個方法,然後直接調用該方法,這就是壹次成功的轉換。
& ltspan style =“font-size:14px;”& gt& ltspan style =“font-size:14px;”& gt公共共享函數Convert to list(of t as { new })(by valdt as datatable)as ilist(of t)‘將datatable轉換為泛型集合。
註意:1,convert tolist(Of T As { New })這裏的New是用來約束T的,必須存在,否則使用new T時會出錯。
新的約束在C#和VB.NET中的寫法不同,C#中使用where來約束t
‘dim my List As New List(Of T)‘定義最終返回的集合。
dim myTpye As Type = GetType(T)‘以獲取實體類的類型名稱。
“Dim dr As DataRow”定義行集。
Dimtempname as string = string。“empty”定義壹個臨時變量。
遍歷DataTable的所有數據行。
對於dt中的每個dr。行
‘dim myT As New T‘定義壹個實體類的對象。
dim properties()as property info = myt . gettype()。“getproperties()”定義屬性集。
Dim Pr As PropertyInfo
遍歷對象的所有屬性。
對於屬性中的每個Pr
TempName = Pr。“名稱”將屬性名稱分配給臨時變量。
檢查數據表是否包含此列(列名= =對象的屬性名)。
if(dt。columns . contains(tempname))T將此屬性與datatable中的列表進行比較,以查看datatable是否包含此屬性。
確定此屬性是否有Setter。
如果(pr。can write = false)t判斷此屬性是否可寫,如果不可寫,則跳出此循環。
繼續
如果…就會結束
Dim值為object = trim(dr(tempname)。“tostring)”定義壹個對象變量來保存列值。
If(值。ToString()& lt;& gtDbnull.value.tostring()如果不為空,則為分配給對象的屬性。
對SetValue(myT,Value,Nothing)‘在操作過程中通過反射動態訪問對象的屬性。
如果…就會結束
如果…就會結束
然後
我的名單。將(myT)‘添加到集合中。
然後
“Return myList”返回實體的集合。
End函數& lt/span>。& lt/span>。
當我們意識到這壹點時,我們只需要補充壹句話
& ltspan style =“font-size:14px;”& gt& ltspan style =“font-size:14px;”& gtmy list = Entity helper . convert tolist(Of Entity。取消卡實體)(表)
返回我的列表& lt/span>。& lt/span>。
實體、實體集和數據表的比較如果用得好,肯定會提高靈活性,所以在未來的研究中,我們是否也應該考慮為什麽要這樣做,如果不這樣做會發生什麽?