0

次の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 ではなく NUMBER を返しています
3) 私はたまたま Oracle.DataAccess.Client ではなく System.Data.OracleClient を使用しています (別の問題のため、を持っていますが、どちらかで解決できれば問題ありません。

次のように、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 から Decimal に変換できませんでした。---> System.InvalidCastException: オブジェクトは IConvertible を実装する必要があります。System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) at System.Data.OracleClient.OracleParameter.CoerceValue(Object value, MetaType destinationType) --- 内部例外スタック トレースの終わり --- System.Data で。 System.Data.OracleClient.OracleParameter.SetCoercedValueInternal(オブジェクト値、MetaType metaType) の OracleClient.OracleParameter.CoerceValue(オブジェクト値、MetaType destinationType) System.Data.OracleClient.OracleParameterBinding.PrepareForBind(OracleConnection 接続、Int32& オフセット) System.Data .OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior 動作, Boolean needRowid,

4

1 に答える 1

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
于 2009-01-04T23:11:31.863 に答える