Можно ли вызвать Oracle FUNCTION из .Net с помощью Enterprise Library?

StackOverflow https://stackoverflow.com/questions/411820

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть следующая функция Oracle:

function get_job_no return number is
        V_job_no number;
      begin
         select appwork.tlm_corphier_job.nextval into V_job_no from dual;
         return V_job_no;
      end get_job_no;

ОБРАТИТЕ ВНИМАНИЕ:
1) Это ФУНКЦИЯ, а не процедура
2) Это возвращает НОМЕР, а не VARCHAR
3) Я использую System.Data.OracleClient, а не Oracle.DataAccess.Client (из-за другой проблемы, с которой я столкнулся), но решение с любым из них будет в порядке.

Я пытаюсь вызвать это из VB.Net, используя корпоративную библиотеку MS следующим образом:

Imports Microsoft.Practices.EnterpriseLibrary.Data
Imports System.Data.OracleClient
    Public Function GetNextJobNumber() As Object
        Dim db As Database = DatabaseFactory.CreateDatabase()
        Dim myresult As Object = Nothing
        Using cmd As DbCommand = db.GetStoredProcCommand("CORPHIER_PKG.get_job_no")
            Dim retval As New Data.OracleClient.OracleParameter("retval", GetType(System.Data.OracleClient.OracleNumber))
            retval.Direction = ParameterDirection.ReturnValue
            cmd.Parameters.Add(retval)
            db.ExecuteNonQuery(cmd)
            myresult = retval.Value
        End Using
        Return myresult
    End Function

Я получаю следующую ошибку:

System.InvalidCastException: не удалось преобразовать значение параметра из RuntimeType в десятичное. --- & GT; System.InvalidCastException: объект должен реализовывать IConvertible.    в System.Convert.ChangeType (значение объекта, тип преобразование типа, поставщик IFormatProvider)    в System.Data.OracleClient.OracleParameter.CoerceValue (значение объекта, MetaType destinationType)    --- Конец внутренней трассировки стека исключений ---    в System.Data.OracleClient.OracleParameter.CoerceValue (значение объекта, MetaType destinationType)    в System.Data.OracleClient.OracleParameter.SetCoercedValueInternal (значение объекта, метатип MetaType)    в System.Data.OracleClient.OracleParameterBinding.PrepareForBind (соединение OracleConnection, Int32 и смещение)    в System.Data.OracleClient.OracleCommand.Execute (оператор OciStatementHandleHandle, поведение CommandBehavior, логическое значение needRowid, OciRowidDescriptor & amp; rowidDescriptor, ArrayList & amp; resultParameterOrdinals)    в System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal (логическое значение needRowid, OciRowidDescriptor & amp; rowidDescriptor)    в System.Data.OracleClient.OracleCommand.ExecuteNonQuery ()    в Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteNonQuery (команда DbCommand)    в Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery (команда DbCommand)

Это было полезно?

Решение

Хорошо, похоже, это работает:

Public Function GetNextJobNumber() As Object
    Dim db As Database = DatabaseFactory.CreateDatabase()
    Using cmd As DbCommand = db.GetStoredProcCommand("CORPHIER_PKG.get_job_no")
        db.AddParameter(cmd, "retval", DbType.Int32, 0, ParameterDirection.ReturnValue, True, 0, 0, String.Empty, DataRowVersion.Current, Convert.DBNull)
        db.ExecuteNonQuery(cmd)
        Return db.GetParameterValue(cmd, "retval")
    End Using
End Function
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top