Получение выходных параметров из сохраненной функции pro c в BL в vb - PullRequest
0 голосов
/ 27 января 2020

Я не очень хорошо разбираюсь в vb. net из c# фона. У меня есть форма с btn и вводом, который принимает строку, запускается и обновляется в БД через сохраненный pro c. Сохраненный pro c должен возвращать параметры @Message и @Success. Тем не менее, я немного растерялся, как вернуть эти параметры. У меня есть 3 функции. Субтитр btn click (который вызывает функцию BL), функция BL (которая вызывает функцию DA) и функция DA (которая вызывает сохраненный pro c на сервере sql). Я также немного сбит с толку относительно того, как все это работает. Я прочитал, что мне не нужно ничего возвращать из моей функции DA, но если это правда, то как функция BA получит параметры успешности / сообщения?

Я знаю, что мне здесь очень не хватает. Может ли кто-нибудь помочь мне реструктурировать это и дать краткое объяснение того, как / почему это работает таким образом. Ниже приведен мой код.

BTN нажмите sub:

    'Button click that calls CertificateOrder BL function InvalidateCertificate() 
    Private Sub btnInvalidateCertificate_Click(sender As Object, e As System.EventArgs) Handles btnInvalidateCertificate.Click
        'Cert ID to invalidate
        Dim certificateId As String = txtCertificateId.Value
        Dim msg As Response.BaseResponse

        'Call stored proc from BL

        msg = CertificateOrder.InvalidateCertificate(certificateId)
        Me.txtCertificateId.ErrorText = msg.Message

        If msg.Success Then
            Forms.FadeForm.ShowDialog(msg.Message, "Success", Forms.FadeForm.MessageIcons.Information, Forms.FadeForm.MessageButtons.Ok)
        End If
    End Sub

BL функция:

   ''' <summary>
    ''' Calls DataAccess function InvalidateCertificate()
    ''' to invalidate certificate
    ''' </summary>
    Public Shared Function InvalidateCertificate(ByVal certificateId As System.String) As Response.BaseResponse

        Using context As New CORADBContext

            Dim message As System.String = ""
            Dim success As System.Boolean = False

            context.InvalidateCertificate(certificateId, success, message)

            Return message
        End Using
    End Function

DA функция:

   ''' <summary>
    ''' Calls the [spInvalidateCertificate] stored proc
    ''' to update a cert to be invalid
    ''' </summary>
    ''' <returns></returns>
    <Extension>
    Public Function InvalidateCertificate(ByVal context As DbContextBase,
                                          ByVal certificateId As System.String,
                                          ByRef success As System.Boolean,
                                          ByRef message As System.String) As Int32

        Dim successParameter As New SqlParameter("@Success", success) With {.Direction = ParameterDirection.InputOutput, .Value = False}
        Dim messageParameter As New SqlParameter("@Message", message) With {.Direction = ParameterDirection.InputOutput, .Value = ""}

        Dim parameters() As SqlParameter = {New SqlParameter("@CertificationValue", certificateId), successParameter, messageParameter}

        Dim results As Int32 = context.ExecuteProcedure("Orders.spInvalidateCertificate", parameters)

        success = DirectCast(successParameter.Value, System.Boolean)
        message = DirectCast(messageParameter.Value, System.String)
        'success and message need to be returned

        Return 0
    End Function

1 Ответ

1 голос
/ 27 января 2020

Вы можете сделать поток немного чище. Как указано в комментариях, я не уверен, что это за объект Response.BaseResponse, поэтому давайте предположим, что у вас нет структуры данных (то есть класса) для возврата данных ответа. Вы можете создать его следующим образом:

Public Class MyResponse

    Public ReadOnly Property Success As Boolean = False
    Public ReadOnly Property Message As String = String.Empty

    Public Sub New(success As Boolean, message As String)
        Me.Success = success
        Me.Message = message
    End Sub

End Class

Теперь выполните рефакторинг кода, чтобы функция DA возвращала объект типа MyResponse:

Public Function InvalidateCertificate(context As DbContextBase,
                                      certificateId As String) As MyResponse

    Dim successParameter As New SqlParameter("@Success", success) With {.Direction = ParameterDirection.InputOutput, .Value = False}
    Dim messageParameter As New SqlParameter("@Message", message) With {.Direction = ParameterDirection.InputOutput, .Value = String.Empty}

    Dim parameters() As SqlParameter = {New SqlParameter("@CertificationValue", certificateId), successParameter, messageParameter}

    Dim results As Integer = context.ExecuteProcedure("Orders.spInvalidateCertificate", parameters)

    Return New MyResponse(successParameter.Value, messageParameter.Value)

End Function

Теперь, рефакторинг функции BL также вернет объект MyResponse:

Public Shared Function InvalidateCertificate(ByVal certificateId As System.String) As MyResponse

    Using context As New CORADBContext

        ' Where does context get passed to the DA???
        Return context.InvalidateCertificate(certificateId)

    End Using

End Function

Одна вещь, которую я не понимаю, - это исходный код для вызова contact.InvalidateCertificate(), который не имеет переменной для context, передаваемой в ???

Наконец, проведите рефакторинг вашего пользовательского интерфейса для обработки результата MyResponse после вызова CertificateOrder.InvalidateCertificate(certificateId)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...