Заполнение таблицы данных C# значениями refcursor из хранимой процедуры Oracle

Я пытаюсь заполнить таблицу данных значениями параметра refcursor UserRole из хранимой процедуры «spValidateDBA», но каждый раз выдает эту ошибку:

Столбец «UserRole» не принадлежит таблице.

Код C#:-

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 = txtUsrId.Text.ToString().ToUpper();
        myCommand.Parameters.Add("UserRole",OracleDbType.RefCursor, 50).Direction = ParameterDirection.Output;
        myCommand.Parameters.Add("UserIdOut", OracleDbType.Varchar2, 50).Direction = ParameterDirection.Output;
        var rolechk = false;
        string checkrole = "DBA";
       myConnection.Open();
       myCommand.ExecuteReader();
        // Create the OracleDataAdapter
        OracleDataAdapter da = new OracleDataAdapter(myCommand);
        DataTable dt = new DataTable();
        da.Fill(dt);  // Trying to populate a DataTable with refcursor UserRole.
        if (myCommand.Parameters["UserIdOut"].Value.ToString().ToUpper() == txtUsrId.Text.ToString().ToUpper())
            {
                CustomMsgbox.Show("1", "DB Utilities Tool", "OK", "Cancel");
                foreach (DataRow dr in dt.Rows)
                {
                    if (dr["UserRole"].ToString().ToUpper().Equals(checkrole)==true)//getting the error "Column 'UserRole' does not belong to table." here
                   {

                        CustomMsgbox.Show("\tLogin Successful..!!\t" + Environment.NewLine + "Welcome to DB Utilities Tool", "DB Utilities Tool", "OK", "Cancel");
                        DBA dba = new DBA();
                        dba.Show();
                        this.Hide();
                        rolechk = true;
                        break;

                    }
                }

                if (!rolechk)
                {

                    CustomMsgbox.Show("Insufficient privileges", "DB Utilities Tool", "OK", "Cancel");
                    myConnection.Close();
                }


        else
            CustomMsgbox.Show("Please enter correct User ID/Password", "DB Utilities Tool", "OK", "Cancel");

    }

Хранимая процедура spValidateDBA

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

person Saptarsi    schedule 20.04.2014    source источник


Ответы (1)


Вы получаете только один столбец GRANTED_ROLE в запросе курсора:

OPEN UserRole FOR выберите GRANTED_ROLE из DBA_USERS DU, .......

однако вы пытаетесь получить столбец UserRole из курсора.

если (dr["UserRole"].ToString().ToUp.........

Там нет столбца с именем UserRole, вы можете получить только GRANTED_ROLE.

person krokodilko    schedule 20.04.2014
comment
Спасибо, приятель, за указание на ошибку, вы спасатель. Я ошибочно рассматривал имя курсора для имени столбца таблицы данных вместо фактического столбца базы данных, извлекаемого из хранимого процесса, еще раз спасибо, очень ценю вашу помощь .. !!! - person Saptarsi; 20.04.2014