Возврат нескольких курсоров ссылок из процедуры Oracle с использованием DAAB & C # - PullRequest
0 голосов
/ 17 июля 2009

Я хочу вернуть данные из процедуры Oracle, чтобы заполнить некоторые элементы управления Label. Процедура принимает 26 входных параметров (переменная поиска) и возвращает 3 выходных курсора. Я успешно возвращал данные из процедуры, которая возвращает один курсор ref, используя OracleCommand, DataAdapter и DataSet, но у меня были всевозможные проблемы, возвращающие данные из процедуры, возвращающей несколько курсоров ref.

Я пытался использовать DAAB из библиотеки предприятия, но безуспешно (исходное сообщение). Теперь я вернулся к OracleCommand на основе сообщений из Oracle и других сайтов разработчиков. Я все еще возвращаю ноль строк. Я могу вернуть имена столбцов от моих читателей, используя «rdr_p_cursor_detail.GetName (0);», но когда я пытаюсь вернуть значение, я получаю «Операция недопустима из-за текущего состояния объекта». ошибка.

        //Open the connection to Oracle.
        OracleConnection cn = new OracleConnection(ConfigurationHelper.ConnectionStringSlabProcedures);
        OracleCommand cmd = new OracleCommand();
        cn.Open();
        cmd.Connection = cn;


        try
        {

            //Set the command text (SQL) of the Oracle command to the stored procedure "getSlab", which returns slab details.
            cmd.CommandText = ConfigurationHelper.ProcuedurePackageSchema + "." +
                              ConfigurationHelper.ProcuedurePackageName + "." +
                              "getSlab";
            //...and specify the command as a stored procedure.
            cmd.CommandType = CommandType.StoredProcedure;


            //Add the input and output parameters.  
            cmd.Parameters.Add("rb_category", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("rb_category_value", OracleDbType.Varchar2).Value = slabID;
            cmd.Parameters.Add("rb_type ", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("rb_chem_value", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_inside_only", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_appl_pending", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_appl_soft_approved", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_appl_hard_approved", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_appl_mechanically", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_as_cast", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_as_dispoed", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_chem_match", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_near_match", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("txt_width_min", OracleDbType.Int32).Value = 0;
            cmd.Parameters.Add("txt_width_max", OracleDbType.Int32).Value = 0;
            cmd.Parameters.Add("txt_quality_min", OracleDbType.Int32).Value = 0;
            cmd.Parameters.Add("txt_quality_max", OracleDbType.Int32).Value = 0;
            cmd.Parameters.Add("txt_days_old_min", OracleDbType.Int32).Value = 0;
            cmd.Parameters.Add("txt_days_old_max", OracleDbType.Int32).Value = 0;
            cmd.Parameters.Add("txt_days_rev_min", OracleDbType.Int32).Value = 0;
            cmd.Parameters.Add("txt_days_rev_max", OracleDbType.Int32).Value = 0;
            cmd.Parameters.Add("txt_reviewer", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_excl_hr", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_excl_cr", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_excl_galv", OracleDbType.Varchar2).Value = string.Empty;
            cmd.Parameters.Add("cb_excl_tin", OracleDbType.Varchar2).Value = string.Empty;



            //Add the ref-cursors as output parameters
            OracleParameter p_cursor_detail = cmd.Parameters.Add("p_cursor_detail", OracleDbType.RefCursor);
            p_cursor_detail.Direction = ParameterDirection.Output;

            OracleParameter p_cursor_comments = cmd.Parameters.Add("p_cursor_comments", OracleDbType.RefCursor);
            p_cursor_comments.Direction = ParameterDirection.Output;

            OracleParameter p_cursor_grades = cmd.Parameters.Add("p_cursor_grades", OracleDbType.RefCursor);
            p_cursor_grades.Direction = ParameterDirection.Output;

            // Execute the command
            cmd.ExecuteNonQuery();


            // Construct an OracleDataReader from the REF CURSOR
            OracleDataReader rdr_p_cursor_detail = ((OracleRefCursor)p_cursor_detail.Value).GetDataReader();

            if (rdr_p_cursor_detail.Read())
            {

                //This would return an error if it was outside this if statement.
                //"Operation is not valid due to the current state of the object."
                OracleString oracleString1 = rdr_p_cursor_detail.GetOracleString(1);
                LabelSlabID.Text = oracleString1.ToString();

                //This correctly returns column name/header.
                //LabelSlabID.Text = rdr_p_cursor_detail.GetName(0);

            }
            else
            {
                LabelSlabID.Text = "No Data";
            }



            rdr_p_cursor_detail.Close();
            rdr_p_cursor_detail.Dispose();

            p_cursor_detail.Dispose();
            p_cursor_comments.Dispose();
            p_cursor_grades.Dispose();

        }
        catch (Exception e)

Укороченная процедура оракула:

PROCEDURE getSlab         
(rb_category                  IN VARCHAR2
,rb_category_value        IN VARCHAR2
,rb_type                      IN VARCHAR2
,rb_chem_value            IN VARCHAR2                                
,cb_inside_only           IN VARCHAR2     
,cb_appl_pending          IN VARCHAR2   
,cb_appl_soft_approved    IN VARCHAR2   
,cb_appl_hard_approved    IN VARCHAR2             
,cb_appl_mechanically     IN VARCHAR2   
,cb_as_cast                   IN VARCHAR2   
,cb_as_dispoed            IN VARCHAR2   
,cb_chem_match            IN VARCHAR2   
,cb_near_match            IN VARCHAR2   
,txt_width_min            IN NUMBER
,txt_width_max            IN NUMBER
,txt_quality_min          IN NUMBER
,txt_quality_max          IN NUMBER
,txt_days_old_min         IN NUMBER
,txt_days_old_max         IN NUMBER     
,txt_days_rev_min         IN NUMBER
,txt_days_rev_max         IN NUMBER
,txt_reviewer             IN VARCHAR2         
,cb_excl_hr               IN VARCHAR2
,cb_excl_cr               IN VARCHAR2
,cb_excl_galv             IN VARCHAR2
,cb_excl_tin                  IN VARCHAR2
,cur_OUT OUT t_cursor1 
,cur_OUT1 OUT t_cursor2
,cur_OUT2 OUT t_cursor3) IS


 --All the queries and so forth are performed and data sent to temp tables.
  OPEN v_cursor1 FOR
        SELECT * FROM TABLE(CAST(g_slab_table AS getSlab_table));
    cur_OUT := v_cursor1;   

  OPEN v_cursor2 FOR
         SELECT * FROM TABLE(CAST(g_comment_table AS getComment_table));
    cur_OUT1 := v_cursor2;      

  OPEN v_cursor3 FOR
         SELECT * FROM TABLE(CAST(g_grades_table AS getGrades_table));
    cur_OUT2 := v_cursor2;      

Есть идеи? Я склоняюсь к неправильному использованию читателя, но не могу понять, что мне не хватает. Спасибо.

Ответы [ 2 ]

1 голос
/ 20 июля 2009

Похоже, это хранимая процедура Oracle. Я изменил вывод курсора, жестко запрограммировав выделение из «двойного», и заголовки данных и столбцов возвращаются хорошо.

Итак ...

Урок 1) Если вы получили сообщение об ошибке «Операция недействительна из-за текущего состояния объекта», ваше соединение закрыто или нет возвращаемых строк данных

Урок 2) Не доверяйте авторам процедур (если вы сами не пишете код БД). Потратьте 30 минут, чтобы просмотреть их код, если вы считаете, что ваш код должен работать. Это может сэкономить вам десяток или около того потраченных впустую часов:).

Спасибо всем.

0 голосов
/ 20 июня 2014

Я прошел почти по тому же сценарию ... Основная проблема заключалась в том, что не было строк возвращаемых данных. Это можно проверить с помощью:

    if(reader.HasRows)

Другая вещь, которая решила мою проблему, была использование

    reader.NextResult()

чтобы перейти к следующему возвращенному (отсутствующему) курсору.

...