H.AL Ответов: 0

Executenonquery занимает слишком много времени в случае, который я не могу понять


Я столкнулся со странной проблемой в своем коде, пытаясь выполнить запрос из .Net. На самом деле у меня есть процедура, которая берет 3 входных сигнала и вставляет их в мою базу данных oracle: 2 десятичных и 1 строковый. Ниже приведена моя функция в .Net:

Public Function MyFunct(ByVal userId As Decimal, ByVal claimId As Decimal, ByVal flag As Integer) As String

    Dim returnedResponse As String = ""
    Dim cmd As OracleCommand
    cmd = New OracleCommand
    cmd.BindByName = True
    cmd.Connection = conn
    cmd.CommandType = CommandType.StoredProcedure
    cmd.CommandText = "MyPack.MyProc"
    Dim Pflag As String = ""

    If flag = 1 Then
        Pflag = "Y"
    Else
        Pflag = "N"
    End If

    'claimId = 2204150


    Try

        Dim Puser_id As New OracleParameter("Puser_id", [Decimal])
        SetParam(Puser_id, userId)
        Puser_id.Direction = ParameterDirection.Input
        cmd.Parameters.Add(Puser_id)

        Dim Pclaimh_id As New OracleParameter("Pclaimh_id", [Decimal])
        SetParam(Pclaimh_id, claimId)
        Pclaimh_id.Direction = ParameterDirection.Input
        cmd.Parameters.Add(Pclaimh_id)

        Dim Psmsflag As New OracleParameter("Psmsflag", [Varchar2])
        SetParam(Psmsflag, Pflag)
        Psmsflag.Direction = ParameterDirection.Input
        cmd.Parameters.Add(Psmsflag)

        Dim P_ERROR As New OracleParameter("P_ERROR", NVarchar2, 1000)
        SetParam(P_ERROR, Nothing)
        P_ERROR.Direction = ParameterDirection.Output
        cmd.Parameters.Add(P_ERROR)

        If conn.State = ConnectionState.Closed Then
            conn.Open()
        End If

        cmd.ExecuteNonQuery()

        If cmd.Parameters("P_ERROR").Value.Value IsNot DBNull.Value Then
            returnedResponse = cmd.Parameters("P_ERROR").Value.Value
        End If
        conn.Close()

    Catch ex As Exception
        returnedResponse = ex.Message
    End Try

    Return returnedResponse

End Function


Эта функция используется во многих классах одинаково:

MyFunct(decUserID, Me.claimH_Id, SMSResponse)

Но в некоторых классах он работает нормально, а в других-cmd.ExecuteNonQuery () входит в бесконечную нагрузку, она никогда не заканчивается, и я не могу себе представить, почему. Но я кое-что понял: когда claimId устанавливается вручную внутри MyFunct, та же проблема возникает и при выполнении. Я проверил Me .claimH_Id, как он заполняется, он одинаковый для всех классов, и в режиме отладки я понял, что все входные данные заполняются правильно без каких-либо проблем и никаких ошибок не возвращается... Так в чем же может быть проблема? Почему вызов его из разных мест вызывает проблемы? Есть предложения? Пожалуйста, Помогите!

Что я уже пробовал:

Я попытался выполнить эту процедуру непосредственно из Oracle, и она работает во всех случаях.

F-ES Sitecore

Проверьте свою базу данных на наличие тупиков (когда у вас есть зависающий запрос), так как это приведет к зависанию выполнения запроса.

H.AL

Почему он не выдал никакой ошибки? Должен ли я подождать некоторое время, чтобы увидеть ошибку? + если бы это был тупик, то почему я сталкиваются с той же проблемой, когда claimId был установлен в 2204150 и метод вызывается из класса, где он используется, чтобы нормально работать, когда claimId не был заполнен, как 2204150 внутри MyFunct?

[no name]

#include & lt;streams.h>

F-ES Sitecore

Вы могли бы подумать, что в конечном итоге получите ошибку тайм-аута, но это не приведет к ошибке в тупике, поскольку тупик не является ошибкой как таковой или ситуацией, которая нуждается в ошибке. Это проблема только в том случае, если тупик никогда не будет разрешен (т. е. вы пытаетесь обновить\выбрать те же данные, а запрос блокирует сам себя).

Что касается ваших различных сценариев, мы не можем запустить ваш код, поэтому понятия не имеем, что происходит в вашей системе. Вам нужно будет использовать инструменты профилирования производительности, доступные для Oracle, чтобы получить лучшее представление о том, что именно выполняется, когда вы страдаете от этих проблем, но это будет не код.

0 Ответов