在 DAL 中找不到数据时如何在 BLL 中引发异常

Posted

技术标签:

【中文标题】在 DAL 中找不到数据时如何在 BLL 中引发异常【英文标题】:How to throw an exception in BLL when no data found in DAL 【发布时间】:2012-11-12 12:23:18 【问题描述】:

当我在文本框中输入的车牌号没有对应的汽车 ID 时,我试图在 BLL 中引发异常。

我的 DAL 如下所示:

Public Class DALCar
    Private dc As New cars_modelDataContext

    Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
        Dim result = (From car In dc.Cars
                    Where car.License_Plate = licensePlate_input
                    Select car.License_Plate).Single
        Return result
    End Function

End Class

这是我的 BLL:

Public Class BLLCar
    Private DALcar As New DALCar

    Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
        Dim carID As String = DALcar.getCarIdByLicensePlate(chassisNo_input)
    End Function

End Class

因此,当没有带有此特定车牌的 carID 时,会在我的 DAL 中引发异常,但是如何在我的 BLL 中而不是在我的 DAL 中引发此异常?

【问题讨论】:

【参考方案1】:

使用 FirstOrDefault 而不是 Single

Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
    Dim result = (From car In dc.Cars
                Where car.License_Plate = licensePlate_input
                Select car.License_Plate).FirstOrDefault 
    Return result


 Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
    Dim carID As String = DALcar.getCarIdByLicensePlate(chassisNo_input)
    If carID = Nothing Then
       Throw New Exception(String.Format("Can't find car id for chassisNo : 0", chassisNo_input))
    End If
End Function

【讨论】:

【参考方案2】:

因为您在 LINQ 表达式中使用了Enumerable.Single。如果序列中有多个元素或序列为空,则会引发异常。

如果您可以假设序列将始终包含 0 或 1 个元素,那么您可以将 Single 替换为 FirstOrDefault(有关此内容的更多信息,请参见下文)。它将返回序列中的第一个元素,如果序列为空,则返回 Nothing

在这种情况下,您可以在 BLL 中检查 Nothing 并在那里抛出相应的异常。

在你的 DAL 中像这样:

Public Class DALCar
    Private dc As New cars_modelDataContext

    Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
        Dim result = (From car In dc.Cars
                    Where car.License_Plate = licensePlate_input
                    Select car.License_Plate).FirstOrDefault
        Return result
    End Function
End Class

这在你的 BLL 中:

Public Class BLLCar
    Private DALcar As New DALCar

    Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
        Dim carID As String = DALcar.getCarIdByLicensePlate(chassisNo_input)
        If carId = Nothing Then
            Throw New ArgumentException("There is no match.")
        End If
    End Function
End Class

如果您的查询可能返回多个元素,则您必须考虑这是否是错误。如果允许并且您想处理(返回)第一个,则继续使用FirstOrDefault。如果这是一个错误,那么你应该从你的 DAL 返回一个枚举并检查你的 BLL 中的项目数(否则,使用Single,你仍然会在 DAL 中抛出)。

【讨论】:

以上是关于在 DAL 中找不到数据时如何在 BLL 中引发异常的主要内容,如果未能解决你的问题,请参考以下文章

BLL,DAL,BO,插入数据

DAL 和 BLL 应通过的类型

C# |如何制作用于将数据从 DAL 传递到 BLL 的类实例(对象)

设计 DAL 和 BLL - 相关表的单个/多个数据存储库

延迟加载的 DAL 和 BLL

在 Web 应用程序中分离 BLL、PL 和 DAL