【问题标题】:Data Access Layer returns DataTable数据访问层返回 DataTable
【发布时间】:2013-01-22 20:11:35
【问题描述】:

请看一下我前段时间问过的以下问题:Breaking BLL (Business Logic Layer) to BLL and DAL (Data Access Layer)

如果我从数据访问层返回一条记录,即 getNameByID 返回一条记录,这种方法(数据传输对象)似乎效果很好。

如果您有一个名为 getName() 的数据访问层函数会返回许多记录,例如成千上万或数百万要在业务逻辑层中处理? (这是一个计划任务)。当需要这样做时,我目前正在返回一个 DataTable(因为数据读取器不能超过 VB.NET 2008 中的连接)。但是,这个问题和答案似乎否定了这种方法:Is returning DataTable or DataSet from DAL is wrong approach。这是一个糟糕的方法吗?

我意识到有像 NHibernate 这样的 ORM 工具,我计划在未来的项目中更多地使用它们。但是,我当前项目中的数据访问代码已经由其他人编写,但我想在进行过程中对其进行重构。

更新 这是一些代码(由 Stephen Doggart 建议):

Imports Microsoft.VisualBasic

        Public Class PersonBLL
            Private Name As String
            Private Age As Integer

            Dim objPersonDAL As New PersonDAL
            Dim personList As List(Of Person)

            'Option 2
            Public Function getPersonByID() As List(Of Person)
                personList = objPersonDAL.getPersonByID()
                Return personList
            End Function



    Public Function ShowMessageBox(ByVal listPersonBLL As List(Of Person))
        For Each p As Person In listPersonBLL
            Me.Age = p.Age
            Me.Name = p.Name
            MsgBox(Me.Age)
            MsgBox(Me.Name)
        Next
    End Function

        End Class

        Public Class PersonDAL
            Private Name As String
            Private Age As Integer

            Public Function getPersonByID() As List(Of Person)
                'Connect to database and get Person.  Return a person object
                Dim personList As List(Of Person) = New List(Of Person)
                Dim p1 As New Person
                p1.Name = "Ian"
                p1.Age = 30
                personList.Add(p1)
                Dim p2 As New Person
                p2.Name = "Steven"
                p2.Age = 28
                personList.Add(p2)
                Dim p3 As New Person
                p3.Name = "Sharon"
                p3.Age = 29
                personList.Add(p3)
                Return (personList)
            End Function
        End Class

        Public Class Person
            Private _Name As String
            Private _Age As Integer

            Public Property Name() As String
                Get
                    Return _Name
                End Get
                Set(ByVal value As String)
                    _Name = value
                End Set
            End Property

            Public Property Age() As Integer
                Get
                    Return _Age
                End Get
                Set(ByVal value As Integer)
                    _Age = value
                End Set
            End Property
        End Class

    Public Class Form1

            Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
                'If Environment.GetCommandLineArgs(0) = "Test" Then
                'MsgBox("Test")
                'End If
                Dim p1 As PersonBLL = New PersonBLL
                Dim p2 As List(Of Person) = p1.getPersonByID()
                Dim p3 As PersonBLL = New PersonBLL
                p3.ShowMessageBox(p2)
            End Sub
        End Class

【问题讨论】:

    标签: vb.net design-patterns


    【解决方案1】:

    返回DataTable 并不完全糟糕——当然还有更糟糕的方法——它只是部分糟糕。但是,除非别无选择,否则谁愿意吃部分糟糕的食物呢?

    因此,除非出于某种原因您需要使用DataTable,否则我建议您坚持使用自定义 DTO 类并让您的 DAL 返回这些对象的列表。例如:

    Public Function GetNames() As List(Of NameDto)
        '...
    End Function
    

    【讨论】:

    • 谢谢。 +1 参考列表。您是否遵循您描述的方法?如果您有 100 万条记录在列表中,您的意见会有什么不同吗?
    • 是的。这是我尽可能使用的方法。 List 对象非常轻量级。如果有的话,我认为它的开销比DataTable 少。我不喜欢以任何数据类型一次返回数百万条记录的想法。在这种情况下,如果您可以将其分解成块或其他东西会更好,但是如果它适用于您的情况,而不会超时,我想,为什么要修复未损坏的部分?跨度>
    • 谢谢。当我说百万时,我夸大了。它更像是成千上万。一旦 DTO 对象(列表)返回到 BLL,我将需要遍历它 - 您是在每个循环上填充 BLL 类的(PersonBLL)实例变量(名称和年龄)还是只使用列表中的值并对列表中的值采取行动?
    • 我不确定你的意思。我想我需要看看你在说什么的例子。
    • 请再看看原来的问题。我已经发布了一些代码。请注意,我在 PersonBLL 类中添加了两个选项(选项 2 已被注释掉)。你能回答我上次评论中的问题吗?
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多