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)

0


source to share


1 answer


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

      

+1


source







All Articles