엔터프라이즈 라이브러리를 사용하여 .NET에서 Oracle Function을 호출 할 수 있습니까?

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) 이것은 바르 차르가 아닌 숫자를 반환합니다.
3) 나는 oracle.dataaccess.client 대신 system.data.oracleclient (내가 가진 다른 문제로 인해)를 사용하고 있지만 어느 쪽이든 해결책은 괜찮을 것입니다.

MS Enterprise Library를 사용하여 VB.net에서 이것을 호출하려고합니다.

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에서 10 진수로 변환하지 못했습니다. ---> System.InvalidCastException : 객체는 상상할 수 있어야합니다. at System.Convert.ChangeType (객체 값, confertionType, iforMatprovider 제공자) system.data.oracleclient.oracleParameter.coercevalue (객체 값, 메타 타입 대상 유형) --- 내부 예외 스택 트레이스 ---- OracleClient.OracleParameter.CoerceValue(Object value, MetaType destinationType) at System.Data.OracleClient.OracleParameter.SetCoercedValueInternal(Object value, MetaType metaType) at System.Data.OracleClient.OracleParameterBinding.PrepareForBind(OracleConnection connection, Int32& offset) at System.Data .OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals) at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor) at System.Data.OracleClient.OracleCommand.ExecuteNonQuery( ) Microsoft.practices.enterpriselibrary.data.database.doexecutenonquery (dbcom MILD COMMAND)에서 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