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, чтобы получить лучшее представление о том, что именно выполняется, когда вы страдаете от этих проблем, но это будет не код.