學生查詢充值記錄之二——DataTable轉型實體集

         之前寫過,D層與U層的關係,因爲DataTable關係更加密切了。爲了使得他倆和平分手(解耦合),就是用了泛型——充當棒打鴛鴦的角色。在D層吧DatatTable轉換成單個的實體,然後再把實體填充到泛型集合衆中。

        實體類就是對數據庫的映射,所以應該將實體類中德屬性和數據庫表中的字段是相對應的,把DataTable中的記錄看作是一個實體,然後把其中的字段讀出來,在放在實體類的屬性中,這樣,再把對應實體類中存在泛型集合中。DataTable中有多少的記錄,在泛型集合衆就有多少個實體類。切記的一點就是,實體類的屬性一定要和數據庫中字段對應,以及屬性的返回類型都要和數據庫中的對應起來。

       對於這個由通過實體類填充泛型集合來代替DataTable的方法,我是寫在了SqlHelper中,因爲就感覺他和SqlHelper中德其他方法一樣,都是公用的,被封裝起來的!

代碼如下:

SQLHelper

 Public Sub dataTableToList(Of T As New)(dt As DataTable, ts As List(Of T))


        '定義一個實體集
        ' Dim ts As List(Of T) = New List(Of T)()
        '獲得此模型的類型
        Dim type As Type = GetType(T)
        ' 定義一個臨時變量()
        Dim tempName As String = String.Empty
        '便利DataTable中所有的數據行
        For Each dr As DataRow In dt.Rows

            Dim m As T = If((Nothing Is Nothing), Activator.CreateInstance(Of T)(), Nothing)
            '獲得此模型的公共屬性
            Dim propertys As PropertyInfo() = m.[GetType]().GetProperties()
            '便利該對象的所有屬性
            Dim array As PropertyInfo() = propertys
            Dim i As Integer = 0
            While i < array.Length
                Dim pi As PropertyInfo = array(i)
                tempName = pi.Name  '將屬性名稱賦值給臨時變量
                '檢查datattable是否包含此列   列名==對象的屬性名
                If dt.Columns.Contains(tempName) Then
                    '判斷此屬性是否有setter
                    If pi.CanWrite Then '該屬性不可寫直接跳出
                        Dim value As Object = dr(tempName)
                        '如果非空,則付給對象的屬性
                        If value IsNot DBNull.Value Then
                            pi.SetValue(m, value, Nothing)
                        End If
                    End If
                End If
                i += 1
                Continue While
            End While
            '添加對象到泛型集合中()
            ts.Add(m)
        Next
    End Sub


D層

   Public Function IInquireCharge(ByVal card As cardReChargeEntity) As IList(Of cardReChargeEntity) Implements IDAL.ICard.IInquireCharge
        Try
            Dim cmdText As String = "Select * from T_CardRecharge where cardId=@cardId "
            Dim sqlParameters As SqlParameter()
            Dim dt As DataTable

            '實例化
            Dim cardRecharge As New List(Of Entity.cardReChargeEntity)
            sqlParameters = {New SqlParameter("@cardId", card.cardId)}
            '顯示調用SQLHelper返回datatable
            dt = sqlHelper.ExecSelect(cmdText, sqlParameters)

            '調用EntitySet方法,使得datatable轉化爲實體集
            entitySet.dataTableToList(dt, cardRecharge)

            '返回轉換後的實體集
            Return cardRecharge
        Catch ex As Exception
            Throw ex
        End Try
    End Function

B層

 

 '查詢學生的充值記錄,在表CardCharge中
    Public Function InquireCharge(ByVal card As Entity.cardReChargeEntity) As IList(Of cardReChargeEntity)
        Try
            Dim iInquireCharge As IDAL.ICard
            iInquireCharge = factory.CreateCardInfo
            Return iInquireCharge.IInquireCharge(card)
        Catch ex As Exception
            Throw ex
        End Try


    End Function

U層

 Private Sub butOk_Click(sender As Object, e As EventArgs) Handles butOk.Click
        Dim card As New Entity.cardReChargeEntity
        Dim mgr As New BLL.CardBLL
        Dim data As IList
        card.cardId = CInt(txtCardId.Text)
        data = CType(mgr.InquireCharge(card), IList)
        DataGridView1.AutoGenerateColumns = False
        DataGridView1.DataSource = data

    End Sub

       這樣就是通過實體類填充泛型集合,實現了學生查詢充值記錄。通過做機房收費系統,感覺很神奇,學到的越來越多,想到的也越來越多了!

       這次給我感觸最深的就是:之前寫代碼上來就說要寫SQLHelper,之後又吵着想想怎麼不返回DataTable了,但是這樣做最終自己只是把時間浪費在了一些自己看不懂的資料上,爲什麼不一步一步的去做呢,當你有了需求,做到一定的時候,那時候再去做這些工作會更好的!

      公路不是從來就有的,當人們學會行走的時候,便有了一條小徑,之後走的人多了,小徑變成了一條路,之後技術發達了,有了各種汽車之後,便開始有了公路!!腳踏實地,勿想一步登天,否則會摔的很慘!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章