在 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 中引发异常的主要内容,如果未能解决你的问题,请参考以下文章