簡體   English   中英

從C#調用Oracle存儲過程

[英]Calling Oracle Stored Procedure from C#

我正在嘗試從C#調用oracle存儲過程'spValidateDBA',但是在嘗試這樣做時,我總是收到一個錯誤-“ PLS-00306:對'SPVALIDATEDBA'的調用中的參數數目或類型錯誤”。

嘗試從C#調用存儲過程參數'UserRole'時可能會出現問題,C#代碼中的類型設置不正確,我也不知道如何正確設置。有人可以在這里幫助我嗎,我確實需要盡快解決此問題。

C#代碼:-

            string a = txtUsrId.Text.ToUpper();
            string sConnectionString = "Data Source=XE;User ID=sys;Password=system;DBA 
            PRIVILEGE=sysdba";
            OracleConnection myConnection = new OracleConnection(sConnectionString);
            OracleCommand myCommand = new OracleCommand("spValidateDBA", myConnection);
            myCommand.CommandType = CommandType.StoredProcedure;
            myCommand.CommandText = "spValidateDBA";
            myCommand.Parameters.Add("UserId", OracleDbType.Varchar2, 50);
            myCommand.Parameters["UserId"].Value = a;
            myCommand.Parameters.Add("UserRole",OracleDbType.Varchar2, 50).Direction =
            ParameterDirection.Output;
            myCommand.Parameters.Add("UserIdOut", OracleDbType.Varchar2, 50).Direction = 
            ParameterDirection.Output;
            var rolechk = false;
            string checkrole = "DBA";
            myConnection.Open();
            myCommand.ExecuteReader();
//this is where i'm getting the error "PLS-00306: wrong number 
//or types of arguments in call to 'SPVALIDATEDBA'"

存儲過程spValidateDBA

create or replace PROCEDURE spValidateDBA(
    UserId IN VARCHAR2,
UserRole OUT STRING_ARRAY,
 UserIdOut OUT VARCHAR2)
  AS
BEGIN
EXECUTE IMMEDIATE 'select GRANTED_ROLE bulk collect into UserRole from DBA_USERS DU,DBA_ROLE_PRIVS DRP where DU.USERNAME=UserId AND DU.USERNAME=DRP.GRANTEE';
EXECUTE IMMEDIATE 'select USERNAME into UserIdOut from DBA_USERS DU where DU.USERNAME=UserId';
  END spValidateDBA;

STRING_ARRAY具有以下語句中聲明的字符串數組類型:

CREATE TYPE STRING_ARRAY AS TABLE OF VARCHAR2(50);

如有任何問題,請讓我知道。

命令文本必須是這樣的:

myCommand.CommandText = "spValidateDBA(:UserId, :UserRole, :UserIdOut )";

然后,您必須調用myCommand.ExecuteNonQuery(); 而不是ExecuteReader。

當您返回一個TABLE而不是VARCHAR時myCommand.Parameters.Add("UserRole",OracleDbType.Varchar2, 50)也是錯誤的。 我認為它應該與此類似:

myCommand.Parameters.Add("UserRole");
myCommand.Parameters["UserRole"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
myCommand.Parameters["UserRole"].Direction = ParameterDirection.Output;

我從未使用PLSQLAssociativeArray作為輸出參數,所以我不確定細節。 也許您的過程可以返回SYS_REFCURSOR。

在您的PL / SQL過程中,我看不到對動態SQL的任何需求,請簡化一下:

create or replace PROCEDURE spValidateDBA(
   UserId IN VARCHAR2, UserRole OUT STRING_ARRAY, UserIdOut OUT VARCHAR2)
  AS
 BEGIN
    select GRANTED_ROLE bulk collect into UserRole from DBA_USERS DU,DBA_ROLE_PRIVS DRP where DU.USERNAME=UserId AND DU.USERNAME=DRP.GRANTEE;
    select USERNAME into UserIdOut from DBA_USERS DU where DU.USERNAME= UserId';
 END spValidateDBA;

暫無
暫無

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

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