Как сохранить значение параметра в процедуре oracle из веб-сервиса

#c# #oracle #plsql

#c# #Oracle #plsql

Вопрос:

Итак, что я хочу сделать, это использовать вызов веб-службы для реализации процедуры oracle. Чтобы быть более конкретным: я хочу, чтобы, когда я помещаю значение в параметр в моей веб-службе и запускаю его, я хочу, чтобы это было значение, отправленное процедуре в oracle, а затем после успешного запуска возвращалось в веб-службу как true.

В настоящее время я пытался сделать следующее:

         public bool InsertMachineModels(string MachineModel)
    {
        logger.DebugFormat("FilteredReportInputsDAO.InsertMachineModel({0})", MachineModel);
        bool retVal = true;
        using (OracleConnection conn = new OracleConnection(connectionString))
        {
            using (OracleCommand cmd = new OracleCommand("Admin_Utilities.InsertMachineModel", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("pMachineModel", OracleType.Cursor).Value = Convert.ToString(MachineModel);
                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    if (IsErrorLogging)
                        logger.Error("FilteredReportInputsDAO.InsertMachineModels() Exception: ", ex);
                    retVal = false;
                }
                finally
                {
                    conn.Close();
                }
            }
        }
        return retVal;
    }
  

Ниже вы найдете мою процедуру, которая выполняется корректно при реализации в sql developer.

    procedure InsertMachineModel( pMachineModel in nvarchar2)
    is
    begin
        insert into machine_models (Machine_model) values (pMachineModel);
        commit;

     Exception when others then
      pb_util.logdata(1, 'Admin_utilities.InsertMachineModel', 'Exception thrown', sqlerrm || ' stack ' || dbms_utility.format_error_backtrace);
      rollback;
      raise;
    end;
  

Я считаю, что проблема заключается в этой строке в веб-сервисе:

 cmd.Parameters.Add("pMachineModel", OracleType.Cursor).Value = Convert.ToString(MachineModel);
  

В моем регистраторе говорится, что курсор должен быть реализован как параметр parameterdirection.output однако я не верю, что в этом случае вы можете взять значение и отправить его в api, но если я ошибаюсь, не стесняйтесь меня поправить.

Итак, я предполагаю, что мой вопрос таков: если то, что я считаю правильным в приведенном выше утверждении о parameterdirection, неверно, каков правильный ответ?

Может ли кто-нибудь дать мне какие-либо предложения относительно того, как правильно реализовать то, что я пытаюсь сделать?

Любая помощь или предложения приветствуются. Спасибо.

Ответ №1:

Я думаю, что ваша проблема в этой строке:

 cmd.Parameters.Add("pMachineModel", OracleType.Cursor).Value = 
    Convert.ToString(MachineModel);
  

Вы пытаетесь добавить параметр типа OracleType.Cursor , который не является правильным или необходимым. Попробуйте изменить строку на эту:

 cmd.Parameters.Add("pMachineModel", OracleType.Char).Value = MachineModel;
  

(Здесь также нет необходимости Convert.ToString MachineModel уже есть String ).