【问题标题】:C# - ORA-06550:wrong number or types of arguments in call to 'DOPROCESS'C# - ORA-06550: 调用“DOPROCESS”时参数的数量或类型错误
【发布时间】:2017-02-26 19:43:03
【问题描述】:

编辑:请参阅帖子 #2

我已经搜索了这里的线程,但我无法弄清楚为什么我会收到 ORA-06550 消息。

Oracle 中的 PL/SQL 进程没有错误。

存储的 PROC 接收 5 个参数,我正在尝试输出单个 NUMBER 参数以进行异常处理。

请告诉我我做错了什么。

PL/SQL

PROCEDURE DoProcess( ocn IN WAREHOUSE.BANK_STATEMENT_ACTIVITY.CHECK_NO%TYPE,
                     oca IN WAREHOUSE.BANK_STATEMENT_ACTIVITY.AMOUNT%TYPE,
                     ecn IN WAREHOUSE.BANK_STATEMENT_ACTIVITY.CHECK_NO%TYPE,
                     eca IN WAREHOUSE.BANK_STATEMENT_ACTIVITY.AMOUNT%TYPE,
                     usr IN WAREHOUSE.BANK_STATEMENT_ACTIVITY.OVERRIDDEN_USER_ID%TYPE,
                     errCode OUT NUMBER )
AS
BEGIN
    Initialize( ocn, oca, ecn, eca, usr );
    DBMS_OUTPUT.PUT_LINE('ocn: ' || ocn || CHR(10) ||
                         'oca: ' || oca || CHR(10) ||
                         'ecn: ' || ecn || CHR(10) ||
                         'eca: ' || eca || CHR(10) ||
                         'usr: ' || usr);
    IF IsValid( bsa_rec.CHECK_NO, errCode ) THEN UpdateProc;
    --DBMS_OUTPUT.PUT_LINE('errCode: ' || errCode);
    END IF;
END DoProcess;

C#

public Int32 BankDataExceptionsDoProcess(string ckNo, string ckAmt, string checkNo, string checkAmt, string user)
    {
        Int32 errCode = 0;

        ckNo  = ckNo.Trim();
        double dblCkAmt = double.Parse(ckAmt.Trim());
        checkNo = checkNo.Trim();
        double dblCheckAmt = double.Parse(checkAmt.Trim());
        int uid = int.Parse(user);


        object obj = null;

        if (DBC == null)
            DBC = new DBConn();

        DBC.ExecutePackage(Vars.pkgBankDataExceptions,
                           out obj,
                           new ParameterDirection[] { ParameterDirection.Input,
                                                      ParameterDirection.Input,
                                                      ParameterDirection.Input,
                                                      ParameterDirection.Input,
                                                      ParameterDirection.Input,
                                                      ParameterDirection.Output },
                           new object[] { ckNo, dblCkAmt, checkNo, dblCheckAmt, uid, errCode }
                          );

        return errCode;
    }

【问题讨论】:

    标签: c# asp.net plsql oracle11g


    【解决方案1】:

    您不能将现有变量用于 ADO.NET 中的 OUTPUT 参数。

    cmd.Parameters.Add("OutputParam", OracleDbType.Int32).Direction = ParameterDirection.Output;
    

    然后在执行后引用:

    if(cmd.Parameters["OutputParam"] != null)
    {
       int returnValue = int.Parse(cmd.Parameters["OutputParam"].Value);
    }
    

    【讨论】:

    • 谢谢 Chuck,我明白你的意思了,我终于弄明白了。我知道这篇文章迟到了,但我正在审查一些旧帖子,这值得一票。再次感谢!
    【解决方案2】:

    我遗漏了一小段代码。无论 oracle 数据类型如何,默认输出对象似乎都包含所有字符串。

    这是缺少的代码:

    errCode = int.Parse(obj.ToString());
    

    整个C#方法:

    public int BankStmntExceptionsDoProcess(string ckNo, string ckAmt, string checkNo, string checkAmt, string user)
        {
            int errCode = 0;;
    
            ckNo     = ckNo.Trim();
            ckAmt    = ckAmt.Trim();
            checkNo  = checkNo.Trim();
            checkAmt = checkAmt.Trim();
            user     = user.Trim();
    
            object obj = null;
    
            if (DBC == null)
                DBC = new DBConn();
    
            DBC.ExecutePackage(Vars.pkgBankStatementProcessing,
                               out obj,
                               new ParameterDirection[] { ParameterDirection.Input,
                                                          ParameterDirection.Input,
                                                          ParameterDirection.Input,
                                                          ParameterDirection.Input,
                                                          ParameterDirection.Input,
                                                          ParameterDirection.Output,
                                                        },
                               new object[] { ckNo, ckAmt, checkNo, checkAmt, user, errCode }
                               );
    
            errCode = int.Parse(obj.ToString());
    
            return errCode;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      相关资源
      最近更新 更多