[英]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.