ممكن للاتصال أوراكل وظيفة من صافي باستخدام مكتبة المؤسسة؟
-
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) وهذا يعود عدد، وليس VARCHAR
3) تصادف أنني كنت تستخدم System.Data.OracleClient بدلا من Oracle.DataAccess.Client (بسبب قضية أخرى كنت أعاني) ولكن الحل إما يكون على ما يرام.
وأنا أحاول أن نطلق على هذا من VB.Net باستخدام مكتبة الشركة MS مثل ذلك:
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 (قيمة كائن، نوع نوع التحويل، مزود IFormatProvider) في System.Data.OracleClient.OracleParameter.CoerceValue (قيمة كائن، MetaType destinationType) --- نهاية الاستثناء الداخلي تتبع مكدس --- في System.Data.OracleClient.OracleParameter.CoerceValue (قيمة كائن، MetaType destinationType) في System.Data.OracleClient.OracleParameter.SetCoercedValueInternal (قيمة كائن، MetaType metaType) في System.Data.OracleClient.OracleParameterBinding.PrepareForBind (اتصال OracleConnection، Int32 والإزاحة) في System.Data.OracleClient.OracleCommand.Execute (OciStatementHandle statementHandle، والسلوك CommandBehavior، منطقية needRowid، OciRowidDescriptor وrowidDescriptor، ArrayList و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)
المحلول
حسنا، يبدو أن هذا العمل:
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