C# - Pl / SQL Проблема с параметром out в хранимой процедуре - PullRequest
0 голосов
/ 18 июня 2020

У меня есть хранимая процедура, которая выглядит так:

    PROCEDURE semifinished_lable_data(p_piece_num_id     IN INTEGER,
                                        p_piece_id         OUT STRING,
                                        p_tickness         OUT NUMBER)
   IS begin
    select p_piece_id,p_tickness into p_piece_id,p_tickness from piece p where p.piece_num_id=p_piece_num_id;
   end;

Я выполнил ее из базы данных, и она отлично сработала. Когда я выполняю его из приложения c#, я не получаю никакого значения.

Затем, когда я исследовал проблему, я добавил, что: cmd.BindByName = true Но на этот раз я Получена следующая ошибка:

несколько экземпляров указанного аргумента в списке

C# коды:

 OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            cmd.InitialLONGFetchSize = 1000;
            var seciliProsedur = "QUA_PRINTING.semifinished_lable_data";
  cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = seciliProsedur;
            cmd.BindByName = true;
            object piece_num_id = gridViewMain.GetFocusedRowCellValue(gridViewMain.FocusedColumn);
 OracleParameter PAR_ID1 = new OracleParameter();
            PAR_ID1.ParameterName = "p_piece_id ";
            PAR_ID1.OracleDbType = OracleDbType.Int32;
            PAR_ID1.Direction = System.Data.ParameterDirection.Input;
            PAR_ID1.Value =piece_num_id;
            PAR_ID1.Size = 100;
            cmd.Parameters.Add(PAR_ID1);
cmd.Parameters.Add("p_piece_id", OracleDbType.Varchar2, 1000, null, ParameterDirection.Output);
cmd.Parameters.Add("p_tickness", OracleDbType.Double,200, null, ParameterDirection.Output);

 conn.Open();


            var da = new OracleDataAdapter(cmd);
            var dt = new DataTable();
            da.Fill(dt);

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 18 июня 2020

На самом деле я никогда не использовал CommandType = CommandType.StoredProcedure.

Попробуйте это

cmd.CommandType = CommandType.Text;
seciliProsedur = "BEGIN QUA_PRINTING.semifinished_lable_data(:p_piece_num_id  , :p_piece_id, :p_tickness); END;"

OracleParameter PAR_ID1 = new OracleParameter();
PAR_ID1.ParameterName = "p_piece_num_id";
...
cmd.Parameters.Add("p_piece_id", OracleDbType.Varchar2, ParameterDirection.Output);
cmd.Parameters("p_piece_id").DbType = DbType.Varchar2;
cmd.Parameters.Add("p_tickness", OracleDbType.Varchar2, 240, null, ParameterDirection.Output);
cmd.Parameters("p_tickness").DbType = DbType.String;

Я думаю, вы должны установить свойства DbType и OracleDbType.

Тогда другая проблема вашего кода -

var da = new OracleDataAdapter(cmd);
var dt = new DataTable();
da.Fill(dt);

Ваша процедура не возвращает никакого набора результатов (т.е. RefCursor), поэтому указанные выше команды не работают. Используйте

cmd.ExecuteNonQuery()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...