C# C和Oracle之间的参数类型无效

C# C和Oracle之间的参数类型无效,c#,oracle,C#,Oracle,我在Oracle中有一个返回序列号的函数。当我试图通过参数在C中获取该值时,它总是告诉我参数类型无效。该返回值的样本值为115545。如果此错误确实正确,那么此值在ODBCType中的对应项是什么?如果它不正确,那么问题是什么 Oracle的功能是: FUNCTION Get_Next_Message_Id__ RETURN NUMBER IS temp_ NUMBER; CURSOR get_in_message_id_seq IS SELECT in_message_id

我在Oracle中有一个返回序列号的函数。当我试图通过参数在C中获取该值时,它总是告诉我参数类型无效。该返回值的样本值为115545。如果此错误确实正确,那么此值在ODBCType中的对应项是什么?如果它不正确,那么问题是什么

Oracle的功能是:

FUNCTION Get_Next_Message_Id__ 
RETURN NUMBER IS

  temp_ NUMBER;
  CURSOR get_in_message_id_seq IS
    SELECT in_message_id_seq.NEXTVAL
      FROM dual;

BEGIN

   General_SYS.Init_Method(lu_name_, 'IN_MESSAGE_API', 'Get_Next_Message_Id__', TRUE);

   OPEN get_in_message_id_seq;
   FETCH get_in_message_id_seq INTO temp_;
   CLOSE  get_in_message_id_seq;

   RETURN(temp_);

END Get_Next_Message_Id__;
C代码:
我相信问题在于你设置下一个id的方式。你首先创建了一个OdbcParameter并设置了它的方向,但是完全忽略了它,然后使用Add方法重新分配变量,默认情况下会创建一个in参数。请尝试以下方法:

OdbcParameter nextId = command.Parameters.Add("temp_", OdbcType.Int);
nextId.Direction = ParameterDirection.Output;

请注意,您还应该使用连接和命令语句,以确保无论发生什么情况,在代码结束时都能清除它们。

我认为问题在于您设置下一个id的方式。您首先创建了一个OdbcParameter并设置了它的方向,但随后完全忽略了它,以及使用Add方法重新分配变量,默认情况下,该方法将创建一个in参数。请尝试以下方法:

OdbcParameter nextId = command.Parameters.Add("temp_", OdbcType.Int);
nextId.Direction = ParameterDirection.Output;

请注意,您还应该使用连接语句和命令语句,以确保在代码结束时清除它们,无论发生什么情况。

在函数中完全不需要光标-只需从dual中的_message _id _seq.NEXTVAL INTO temp u中选择光标;在发布代码时,请不要使用制表符。光标在您的功能中完全没有必要-它只需要在“消息id”的“下一步”中选择“从dual进入临时”;请不要在发布代码时使用标签。你完全正确。我不是在两个步骤中创建,而是在一个步骤中创建了这个参数,因为在这两个步骤之间存在类型分配问题。不是,它工作得很好。非常感谢乔恩,你说得很对。我不是在两个步骤中创建,而是在一个步骤中创建了这个参数,因为在这两个步骤之间存在类型分配问题。不是,它工作得很好。谢谢你,乔恩。