2009-01-04 57 views
0

我有以下Oracle功能:可能使用Enterprise Library從.Net調用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; 

請注意:
1)這是一個函數,而不是一個程序
2)該函數返回一個數,而不是一個VARCHAR
3)I發生要使用System.Data.OracleClient而不是Oracle.DataAccess.Client(由於我遇到的另一個問題),但使用任何一種解決方案都可以。

我試圖使用MS企業庫,像這樣從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爲十進制。 ---> System.InvalidCastException:對象必須實現IConvertible。 在System.Convert.ChangeType(對象值,類型conversionType,的IFormatProvider提供商) 在System.Data.OracleClient.OracleParameter.CoerceValue(對象值,元類型destinationType) ---內部異常堆棧跟蹤的結尾--- 在System.Data.OracleClient.OracleParameter.CoerceValue(對象值,MetaType目標類型) 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,ArrayLis噸& 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

好吧,這似乎工作:

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 
相關問題