2

テキストボックスに入力したナンバープレート番号に対応するcarIDがない場合、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で例外がスローされますが、DALではなくBLLでこの例外をスローするにはどうすればよいですか?

4

2 に答える 2

0

Single の代わりに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
于 2012-11-24T11:51:53.920 に答える
0

Enumerable.SingleLINQ式で使用しているためです。シーケンスに複数の要素がある場合、またはシーケンスが空の場合、例外がスローされます。

シーケンスに常に 0 または 1 つの要素が含まれると想定できる場合は、次のように置き換えることができますSingle(FirstOrDefault詳細については後述します)。シーケンスの最初の要素を返すかNothing、シーケンスが空の場合。

この場合Nothing、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).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 内のアイテムの数を確認する必要があります (それ以外の場合は、SingleDAL 内でスローします)。

于 2012-11-24T11:49:56.807 に答える