2012-11-24 21 views
2

我想拋出一個異常,在我的BLL時,有沒有相應的carID因爲我已經在文本框中輸入的車牌號沒有發現任何數據。如何扔在BLL一個異常時,在DAL

我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 

所以當有這個特殊車牌的異常在我的DAL扔沒有carID,但我怎樣才能在我的BLL而不是在我的DAL中拋出這個異常?

回答

0

因爲你在你的LINQ表達式中使用Enumerable.Single。如果序列中有多個元素或者序列爲空,它會引發異常。

如果您可以假設該序列將始終包含0或1個元素,那麼您可以用FirstOrDefault替換Single(稍後參見更多信息)。如果序列爲空,它將返回序列中的第一個元素或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)。

0

使用FirstOrDefault而不是單

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 
+0

謝謝,我會嘗試了這一點! – Wout