Can I call Oracle FUNCTION from .Net using Enterprise Library?
I have the following Oracle function:
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;
PLEASE NOTE:
1) This is a FUNCTION, not a procedure 2) This returns a NUMBER, not a VARCHAR
3) I am using System.Data.OracleClient and not Oracle.DataAccess.Client (due to another problem I had) but a solution with anyone will be fine.
I am trying to call this from VB.Net using MS Enterprise Library, for example:
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
I am getting the following error:
System.InvalidCastException: Failed to convert parameter value from RuntimeType to decimal. ---> System.InvalidCastException: Object must implement IConvertible. at System.Convert.ChangeType (object value, conversionType, IFormatProvider provider) at System.Data.OracleClient.OracleParameter.CoerceValue (object value, metatext destination type) --- End of internal check of exception stack --- at System.Data. OracleClient.OracleParameter.CoerceValue (object value, metatext destination type) at System.Data.OracleClient.OracleParameter.SetCoercedValueInternal (object value, MetaType metaType) at System.Data.OracleClient.OracleParameterBinding.PrepareForBind (System.Data.OracleClient.OracleParameterBinding. .Data.OracleClient.OracleCommand.Execute (OciStatementHandle statementHandle, CommandBehavior behavior,Boolean needRowid, OciRowidDescriptor & rowidDescriptor, ArrayList & resultParameterOrdinals) at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal (Boolean needRowid, OciRowidDescriptor & rowidOracleOrdinals) Database.DoExecuteNonQuery (DbCommand Command) at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery (DbCommand Command)DoExecuteNonQuery (DbCommand Command) at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery (DbCommand Command)DoExecuteNonQuery (DbCommand Command) at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery (DbCommand Command)
source to share
Ok, this works:
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
source to share