【问题标题】:Pass Function Parameter in Oracle Function using C# is not working使用 C# 在 Oracle 函数中传递函数参数不起作用
【发布时间】:2018-09-14 13:17:02
【问题描述】:

我正在从我的 C# 代码中调用 Oracle 函数,例如:

string spName = "ANALYZERS.NEXT_COUNTER";
        OracleCommand oracleCommand = new OracleCommand(spName, Utils.Connection)
        {
            CommandType = System.Data.CommandType.StoredProcedure
        };

        oracleCommand.Parameters.Add("P_COUNTER_TYPE", OracleDbType.Varchar2).Value = "ANALYZERS.STRING_COUNTER";
        oracleCommand.Parameters.Add("P_WHERE_CLAUSE", OracleDbType.Varchar2).Value = "RCH04";
        oracleCommand.Parameters.Add("P_CALLING_OBJECT", OracleDbType.Varchar2).Value = null;
        oracleCommand.Parameters.Add("P_CALLING_USER", OracleDbType.Varchar2).Value = null;
        oracleCommand.Parameters.Add("P_CAlLING_EVENT", OracleDbType.Varchar2).Value = null;

        oracleCommand.Parameters.Add("P_ERROR", OracleDbType.Varchar2);
        oracleCommand.Parameters["P_ERROR"].Direction = System.Data.ParameterDirection.Output;

        oracleCommand.Parameters.Add("RETURN_VALUE", OracleDbType.Varchar2);
        oracleCommand.Parameters["RETURN_VALUE"].Size = 4000;
        oracleCommand.Parameters["RETURN_VALUE"].Direction = System.Data.ParameterDirection.ReturnValue;

        if (Utils.Connection.State != System.Data.ConnectionState.Open)
        {
            Utils.Connection.Open();
        }
        try
        {
            oracleCommand.ExecuteNonQuery();
            var retValue = oracleCommand.Parameters["RETURN_VALUE"].Value;
            stringId = retValue.ToString();
            Console.WriteLine(stringId);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            Utils.Connection.Close();
        }

当我执行它时,我在retValue 中收到 Unknown counter type.... 消息,这是错误的。这是因为参数P_COUNTER_TYPE的值不正确,就是传值不正确。

有什么帮助吗?在 Oracle 函数中传递 VARCHAR2 值的其他方法是什么?请注意,我使用的是OracleDbType 而不是OracleType

我看过使用OracleType 的文章。使用OracleDbType 代替OracleType 有什么问题吗?

Oracle 函数块:

CREATE OR REPLACE FUNCTION ANALYZERS.NEXT_COUNTER(P_COUNTER_TYPE   IN VARCHAR2,
                                              P_WHERE_CLAUSE   IN VARCHAR2 DEFAULT NULL,
                                              P_CALLING_OBJECT IN VARCHAR2,
                                              P_CALLING_USER   IN VARCHAR2,
                                              P_CAlLING_EVENT  IN VARCHAR2,
                                              P_ERROR          OUT VARCHAR2)
   RETURN VARCHAR2 IS

   .....

    IF P_COUNTER_TYPE = 'ANALYZERS.STRING_COUNTER' THEN
--  Old Code
--  SELECT ANALYZERS.SEQ_STRING_COUNTER.NEXTVAL INTO V_RESULT FROM DUAL;
--
--    RETURN(SUBSTR(V_RESULT, -10));
SELECT CURRENT_YEAR
  INTO V_CURR_YEAR
  FROM ANALYZERS.SYSTEM_CURRENT_YEAR CY;
SELECT ANALYZERS.SEQ_STRING_COUNTER.NEXTVAL INTO V_RESULT FROM DUAL;
IF NVL(LENGTH(V_RESULT), 0) >= 8 THEN
  V_NEXT_NUM := SUBSTR(V_RESULT, -8);
ELSE
  V_NEXT_NUM := V_RESULT;
END IF;
V_RESULT := P_CALLING_LOCATION_ID || V_CURR_YEAR ||
            LPAD(V_NEXT_NUM, 8, '0');
RETURN V_RESULT;
ELSE
P_ERROR  := 'Unknown counter type....';
V_RESULT := NULL;
END IF;
 RETURN V_RESULT;

【问题讨论】:

  • 那么您在P_COUNTER_TYPE 中得到了什么?你记录或输出了吗?
  • 问题是,你需要按照函数中定义的顺序传递参数。

标签: c# oracle odac


【解决方案1】:

您输入OracleParameters 的方式在我看来有点古怪。

不如试试这个,

OracleParameter [] parameters = {
    new OracleParameter("P_COUNTER_TYPE", OracleDbType.Varchar2, "ANALYZERS.STRING_COUNTER", ParameterDirection.Input);
    ...
};

command.Parameters.AddRange(parameters);

【讨论】:

  • 我尝试了你提到的方法,但没有奏效。最终,只有当我按照 Function 中定义的顺序传递参数并解决问题时,它才起作用。
  • @FaizanMubasher 您可能会发现BindByName 属性对您很有用。只需确保在 C# 代码和 SQL 代码中调用相同的参数即可。 command.BindByName = true.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多