Можно ли вызвать Oracle FUNCTION из .Net с помощью Enterprise Library? - PullRequest
0 голосов
/ 05 января 2009

У меня есть следующая функция 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 в десятичное. ---> 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 & rowidDescriptor, ArrayList & resultParameterOrdinals) в System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal (логическое значение needRowid, OciRowidDescriptor & rowidDescriptor) в System.Data.OracleClient.OracleCommand.ExecuteNonQuery () в Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteNonQuery (команда DbCommand) в Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery (команда DbCommand)

1 Ответ

1 голос
/ 05 января 2009

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...