簡體   English   中英

存儲過程中的輸出參數(Oracle數據庫)

[英]Out parameters in stored procedures (oracle database)

我在Oracle中使用存儲過程。 如何在C#代碼中使用SP的參數?

我使用以下代碼:

甲骨文SP

PROCEDURE TABMPWORKREQUEST_INS(INTWORKREQUEST_ IN NUMBER, VCWORKREQUESTNUMBER_ OUT  VARCHAR2,
INTREQUESTEDBY_ IN NUMBER, INTWORKTYPE_ IN NUMBER,INTACTIONTYPE_ IN NUMBER,
  INTPRIORITY_ IN NUMBER, INTRECORDID_ IN NUMBER, INTPERMITREQUIRED_ IN NUMBER, VCINSPECTIONREQUIRED_ IN CHAR,
   VCLASTUSERID_ IN VARCHAR2,  INTCOSTCENTRECODE_ IN NUMBER, VCBUDGETHEAD_ IN VARCHAR2
   , VCREFERENCEWORKORDERNUMBER_ IN VARCHAR2, VCJOBDESCRIPTION_ IN VARCHAR2,
     VCSTATUS_ IN CHAR, VCHISTORYFLAG_ IN CHAR, VCREASONCODE_ IN VARCHAR2 
  , VCMSSNUMBER_ IN VARCHAR2, INTAUTHORIZELEVEL_ IN NUMBER, INTPRINTFLAG_ IN NUMBER,
       INTINSPECTIONFLAG_ IN NUMBER, INTDAYNUMBER_ IN NUMBER, INTDURATION_ IN NUMBER, INTPROGRESS_ IN NUMBER,
        INTWORKSHOPFLAG_ IN CHAR)
 IS 

 EXISTANCE number; 
 UID_ VARCHAR(5); 
 SS varchar2(20);


 BEGIN 
 SELECT COUNT(*) into EXISTANCE FROM TABMPWORKREQUEST WHERE INTWORKREQUEST = INTWORKREQUEST_ ;

 IF VCLASTUSERID_ = '0' THEN 
                 UID_ := 'U2';
 ELSE 
                 UID_ := VCLASTUSERID_;
 END IF;






        select GetWorkOrderNumber(INTREQUESTEDBY_) INTO SS  from dual ;

    VCWORKREQUESTNUMBER_ :=SS;

       INSERT INTO TABMPWORKREQUEST
       VALUES(     CMMS.SEQTABMPWORKREQUEST.NEXTVAL ,      SS ,     sysdate ,     INTrequestedby_ ,    
         INTworktype_ ,      INTactiontype_ ,      INTpriority_ ,      Intrecordid_ ,      Intpermitrequired_ ,      Vcinspectionrequired_ ,   
            Vclastuserid_ ,     SYSDATE ,      sysdate ,      INTcostcentrecode_ ,      Vcbudgethead_ ,      sysdate ,  
                Vcreferenceworkordernumber_ ,      Vcjobdescription_ , '01' ,      Vchistoryflag_ ,      Vcreasoncode_ ,    
                  sysdate ,      sysdate ,      Vcmssnumber_ ,      Intauthorizelevel_ ,      Intprintflag_ ,      Intinspectionflag_ ,  
                      Intdaynumber_ ,      Intduration_ ,      Intprogress_ ,      Intworkshopflag_  ); 



END TABMPWORKREQUEST_INS;

和C#代碼

 public bool InsertMpWORKREQUEST(ClsFieldsMpWORKREQUEST fieldsMpWORKREQUEST)
    {
        string DTBDDATETIME;
        if (fieldsMpWORKREQUEST.DTBDDATETIME != null)
        {
            DTBDDATETIME = String.Format("{0:dd/MM/yyyy HH:mm:ss}", fieldsMpWORKREQUEST.DTBDDATETIME);
            DTBDDATETIME = "TO_DATE('" + DTBDDATETIME + "', 'MM/DD/YYYY HH24:MI:SS')";
        }
        else
        {
            DTBDDATETIME = "NULL";
        }



        string DateExpire = string.Empty;
        if (fieldsMpWORKREQUEST.DTEXPIRYDATE != null)
        {
            DateExpire = String.Format("{0:dd/MM/yyyy HH:mm:ss}", fieldsMpWORKREQUEST.DTEXPIRYDATE);
            DateExpire = "TO_DATE('" + DateExpire + "', 'MM/DD/YYYY HH24:MI:SS')";
        }
        else
        {
            DateExpire = "NULL";
        }

        string DtStartDate;
        if (fieldsMpWORKREQUEST.DTSTARTDATE != null)
        {
            DtStartDate = String.Format("{0:dd/MM/yyyy HH:mm:ss}", fieldsMpWORKREQUEST.DTSTARTDATE);
            DtStartDate = "TO_DATE('" + DtStartDate + "', 'MM/DD/YYYY HH24:MI:SS')";
        }
        else
        {
            DtStartDate = "NULL";
        }

        string DtComplementationDate;
        if (fieldsMpWORKREQUEST.DTCOMPLETIONDATE != null)
        {
            DtComplementationDate = String.Format("{0:dd/MM/yyyy HH:mm:ss}", fieldsMpWORKREQUEST.DTCOMPLETIONDATE);
            DtComplementationDate = "TO_DATE('" + DtComplementationDate + "', 'MM/DD/YYYY HH24:MI:SS')";
        }
        else
        {
            DtComplementationDate = "NULL";
        }



        OracleConnection cn = new OracleConnection(this.GetConnectionString());
        OracleCommand cmd = new OracleCommand("CMMS_MPWORKREQUEST_PKG.TABMPWORKREQUEST_INS", cn);
        cmd.CommandType = CommandType.StoredProcedure;


       OracleParameter INTWORKREQUEST = new OracleParameter();
       INTWORKREQUEST.ParameterName = "INTWORKREQUEST_";
       INTWORKREQUEST.OracleType = OracleType.Number;
       INTWORKREQUEST.Direction = ParameterDirection.Input;
       INTWORKREQUEST.Value = fieldsMpWORKREQUEST.INTWORKREQUEST;
       cmd.Parameters.Add(INTWORKREQUEST);
      // cmd.Parameters.AddWithValue("VCWORKREQUESTNUMBER_", fieldsMpWORKREQUEST.VCWORKREQUESTNUMBER).Direction=ParameterDirection.Output;
        OracleParameter requestNo = new OracleParameter();
        requestNo.ParameterName = "VCWORKREQUESTNUMBER_";
        requestNo.OracleType = OracleType.VarChar;
        requestNo.Size = 14;
        requestNo.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(requestNo);

       OracleParameter INTREQUESTEDBY = new OracleParameter();
       INTREQUESTEDBY.ParameterName = "INTREQUESTEDBY_";
       INTREQUESTEDBY.OracleType = OracleType.Number; 
       INTREQUESTEDBY.Direction = ParameterDirection.Input;
       INTREQUESTEDBY.Value = fieldsMpWORKREQUEST.INTREQUESTEDBY.INTSECTIONID;
       cmd.Parameters.Add(INTREQUESTEDBY);



        OracleParameter INTWORKTYPE = new OracleParameter();
        INTWORKTYPE.ParameterName = "INTWORKTYPE_";
        INTWORKTYPE.OracleType = OracleType.Number;
        INTWORKTYPE.Direction = ParameterDirection.Input;
        INTWORKTYPE.Value = fieldsMpWORKREQUEST.INTREQUESTEDBY.INTSECTIONID;
        cmd.Parameters.Add(INTWORKTYPE);

        OracleParameter INTACTIONTYPE = new OracleParameter();
        INTACTIONTYPE.ParameterName = "INTACTIONTYPE_";
        INTACTIONTYPE.OracleType = OracleType.Number;
        INTACTIONTYPE.Direction = ParameterDirection.Input;
        INTACTIONTYPE.Value = fieldsMpWORKREQUEST.INTACTIONTYPE.INTSECTIONID;
        cmd.Parameters.Add(INTACTIONTYPE);

       OracleParameter INTPRIORITY = new OracleParameter();
       INTPRIORITY.ParameterName = "INTPRIORITY_";
       INTPRIORITY.OracleType = OracleType.Number;
       INTPRIORITY.Direction = ParameterDirection.Input;
       INTPRIORITY.Value = fieldsMpWORKREQUEST.INTPRIORITY.INTGENERALCODE;
       cmd.Parameters.Add(INTPRIORITY);

        OracleParameter INTRECORDID = new OracleParameter();
        INTRECORDID.ParameterName = "INTRECORDID_";
        INTRECORDID.OracleType = OracleType.Number;
        INTRECORDID.Direction = ParameterDirection.Input;
        INTRECORDID.Value = fieldsMpWORKREQUEST.INTRECORDID;
        cmd.Parameters.Add(INTRECORDID);

        OracleParameter INTPERMITREQUIRED = new OracleParameter();
        INTPERMITREQUIRED.ParameterName = "INTPERMITREQUIRED_";
        INTPERMITREQUIRED.OracleType = OracleType.Number;
        INTPERMITREQUIRED.Direction = ParameterDirection.Input;
        INTPERMITREQUIRED.Value = fieldsMpWORKREQUEST.INTPERMITREQUIRED;
        cmd.Parameters.Add(INTPERMITREQUIRED);



        OracleParameter VCINSPECTIONREQUIRED = new OracleParameter();
        VCINSPECTIONREQUIRED.ParameterName = "VCINSPECTIONREQUIRED_";
        VCINSPECTIONREQUIRED.OracleType = OracleType.Char;
        VCINSPECTIONREQUIRED.Direction = ParameterDirection.Input;
        VCINSPECTIONREQUIRED.Value = fieldsMpWORKREQUEST.VCINSPECTIONREQUIRED;
        cmd.Parameters.Add(VCINSPECTIONREQUIRED);


        OracleParameter VCLASTUSERID = new OracleParameter();
        VCLASTUSERID.ParameterName = "VCLASTUSERID_";
        VCLASTUSERID.OracleType = OracleType.VarChar;
        VCLASTUSERID.Direction = ParameterDirection.Input;
        VCLASTUSERID.Value = fieldsMpWORKREQUEST.VCLASTUSERID;
        cmd.Parameters.Add(VCLASTUSERID);



        OracleParameter INTCOSTCENTRECODE = new OracleParameter();
        INTCOSTCENTRECODE.ParameterName = "INTCOSTCENTRECODE_";
        INTCOSTCENTRECODE.OracleType = OracleType.Number;
        INTCOSTCENTRECODE.Direction = ParameterDirection.Input;
        INTCOSTCENTRECODE.Value = fieldsMpWORKREQUEST.INTCOSTCENTRECODE.INTGENERALCODE;
        cmd.Parameters.Add(INTCOSTCENTRECODE);

        OracleParameter vCBUDGETHEAD = new OracleParameter();
        vCBUDGETHEAD.ParameterName = "VCBUDGETHEAD_";
        vCBUDGETHEAD.OracleType = OracleType.VarChar;
        vCBUDGETHEAD.Direction = ParameterDirection.Input;
        vCBUDGETHEAD.Value = fieldsMpWORKREQUEST.VCBUDGETHEAD;
        cmd.Parameters.Add(vCBUDGETHEAD);




       OracleParameter VCREFERENCEWORKORDERNUMBER = new OracleParameter();
       VCREFERENCEWORKORDERNUMBER.ParameterName = "VCREFERENCEWORKORDERNUMBER_";
       VCREFERENCEWORKORDERNUMBER.OracleType = OracleType.VarChar;
       VCREFERENCEWORKORDERNUMBER.Direction = ParameterDirection.Input;
       VCREFERENCEWORKORDERNUMBER.Value = fieldsMpWORKREQUEST.VCREFERENCEWORKORDERNUMBER;
       cmd.Parameters.Add(VCREFERENCEWORKORDERNUMBER);


        OracleParameter VCJOBDESCRIPTION = new OracleParameter();
        VCJOBDESCRIPTION.ParameterName = "VCJOBDESCRIPTION_";
        VCJOBDESCRIPTION.OracleType = OracleType.VarChar;
        VCJOBDESCRIPTION.Direction = ParameterDirection.Input;
        VCJOBDESCRIPTION.Value = fieldsMpWORKREQUEST.VCJOBDESCRIPTION;
        cmd.Parameters.Add(VCJOBDESCRIPTION);


        OracleParameter VCSTATUS = new OracleParameter();
        VCSTATUS.ParameterName = "VCSTATUS_";
        VCSTATUS.OracleType = OracleType.Char;
        VCSTATUS.Direction = ParameterDirection.Input;
        VCSTATUS.Value = fieldsMpWORKREQUEST.VCSTATUS;
        cmd.Parameters.Add(VCSTATUS);


        OracleParameter VCHISTORYFLAG = new OracleParameter();
        VCHISTORYFLAG.ParameterName = "VCHISTORYFLAG_";
        VCHISTORYFLAG.OracleType = OracleType.Char;
        VCHISTORYFLAG.Direction = ParameterDirection.Input;
        VCHISTORYFLAG.Value = fieldsMpWORKREQUEST.VCHISTORYFLAG;
        cmd.Parameters.Add(VCHISTORYFLAG);


        OracleParameter VCREASONCODE = new OracleParameter();
        VCREASONCODE.ParameterName = "VCREASONCODE_";
        VCREASONCODE.OracleType = OracleType.VarChar;
        VCREASONCODE.Direction = ParameterDirection.Input;
        VCREASONCODE.Value = fieldsMpWORKREQUEST.VCREASONCODE;
        cmd.Parameters.Add(VCREASONCODE);


        OracleParameter VCMSSNUMBER = new OracleParameter();
        VCMSSNUMBER.ParameterName = "VCMSSNUMBER_";
        VCMSSNUMBER.OracleType = OracleType.VarChar;
        VCMSSNUMBER.Direction = ParameterDirection.Input;
        VCMSSNUMBER.Value = fieldsMpWORKREQUEST.VCMSSNUMBER;
        cmd.Parameters.Add(VCMSSNUMBER);


        OracleParameter INTAUTHORIZELEVEL = new OracleParameter();
        INTAUTHORIZELEVEL.ParameterName = "INTAUTHORIZELEVEL_";
        INTAUTHORIZELEVEL.OracleType = OracleType.Number;
        INTAUTHORIZELEVEL.Direction = ParameterDirection.Input;
        INTAUTHORIZELEVEL.Value = fieldsMpWORKREQUEST.INTAUTHORIZELEVEL;
        cmd.Parameters.Add(INTAUTHORIZELEVEL);


        OracleParameter INTPRINTFLAG = new OracleParameter();
        INTPRINTFLAG.ParameterName = "INTPRINTFLAG_";
        INTPRINTFLAG.OracleType = OracleType.Number;
        INTPRINTFLAG.Direction = ParameterDirection.Input;
        INTPRINTFLAG.Value = fieldsMpWORKREQUEST.INTPRINTFLAG;
        cmd.Parameters.Add(INTPRINTFLAG);


        OracleParameter INTINSPECTIONFLAG = new OracleParameter();
        INTINSPECTIONFLAG.ParameterName = "INTINSPECTIONFLAG_";
        INTINSPECTIONFLAG.OracleType = OracleType.Number;
        INTINSPECTIONFLAG.Direction = ParameterDirection.Input;
        INTINSPECTIONFLAG.Value = fieldsMpWORKREQUEST.INTINSPECTIONFLAG;
        cmd.Parameters.Add(INTINSPECTIONFLAG);


        OracleParameter INTDAYNUMBER = new OracleParameter();
        INTDAYNUMBER.ParameterName = "INTDAYNUMBER_";
        INTDAYNUMBER.OracleType = OracleType.Number;
        INTDAYNUMBER.Direction = ParameterDirection.Input;
        INTDAYNUMBER.Value = fieldsMpWORKREQUEST.INTDAYNUMBER;
        cmd.Parameters.Add(INTDAYNUMBER);


        OracleParameter INTDURATION = new OracleParameter();
        INTDURATION.ParameterName = "INTDURATION_";
        INTDURATION.OracleType = OracleType.Number;
        INTDURATION.Direction = ParameterDirection.Input;
        INTDURATION.Value = fieldsMpWORKREQUEST.INTDURATION;
        cmd.Parameters.Add(INTDURATION);


        OracleParameter INTPROGRESS = new OracleParameter();
        INTPROGRESS.ParameterName = "INTPROGRESS_";
        INTPROGRESS.OracleType = OracleType.Number;
        INTPROGRESS.Direction = ParameterDirection.Input;
        INTPROGRESS.Value = fieldsMpWORKREQUEST.INTPROGRESS;
        cmd.Parameters.Add(INTPROGRESS);


        OracleParameter INTWORKSHOPFLAG = new OracleParameter();
        INTWORKSHOPFLAG.ParameterName = "INTWORKSHOPFLAG_";
        INTWORKSHOPFLAG.OracleType = OracleType.Char;
        INTWORKSHOPFLAG.Direction = ParameterDirection.Input;
        INTWORKSHOPFLAG.Value = fieldsMpWORKREQUEST.INTWORKSHOPFLAG;
        cmd.Parameters.Add(INTWORKSHOPFLAG);

        string requestNo2 = string.Empty;
        int rowEfect = 0;
        try
        {
            cn.Open();
            rowEfect = cmd.ExecuteNonQuery();
            requestNo2 = cmd.Parameters["VCWORKREQUESTNUMBER_"].Value.ToString();

        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            if (cn.State != ConnectionState.Closed) cn.Close();
        }
        return rowEfect > 0;
    }

但是我收到以下錯誤:

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'TABMPWORKREQUEST_INS'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我該如何解決這個問題?

與Oracle有關的MSFT System.Data命名空間中的對象已被棄用:

http://msdn.microsoft.com/en-us/library/77d8yct7.aspx

但是有一個通用的System.Data.OleDB命名空間:

http://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbparameter.direction(v=VS.71).aspx

Command對象具有一個參數集合。 每個參數都有幾個屬性,包括direction屬性。 當將該屬性設置為輸出時,可以在發出命令后檢查其值。

Oracle的第三方提供商應提供類似的功能。

PS:我已經很長時間沒有使用OleDB命名空間了,但是請記住,必須按照在SP簽名中出現的順序,將參數添加到Parameters集合中。 確保為每個參數設置適當的數據類型,並提供要傳遞的任何文本值的長度。

PPS好像您兩次向集合添加相同的參數; 其中之一應該被注釋掉嗎?

cmd.Parameters.AddWithValue("VCWORKREQUESTNUMBER_",fieldsMpWORKREQUEST.VCWORKREQUESTNUMBER).Direction=ParameterDirection.Output;
OracleParameter requestNo = new OracleParameter();
requestNo.ParameterName = "VCWORKREQUESTNUMBER_";
requestNo.OracleType = OracleType.VarChar;
requestNo.Size = 14;
requestNo.Direction = ParameterDirection.Output;
cmd.Parameters.Add(requestNo);

暫無
暫無

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

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