簡體   English   中英

C# - ORA-06550:調用“DOPROCESS”時的參數數量或類型錯誤

[英]C# - ORA-06550:wrong number or types of arguments in call to 'DOPROCESS'

編輯:請參閱帖子 #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;
    }

不能在 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);
}

我錯過了一小段代碼。 無論 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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM