Можно ли вызвать Oracle FUNCTION из .Net с помощью Enterprise Library?
-
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