Исключение ORA-06550 при вызове хранимой процедуры oracle из C#

#c# #oracle

#c# #Oracle

Вопрос:

Я пытаюсь вызвать хранимую процедуру Oracle из моего приложения на C # и получаю следующую ошибку:

ORA-06550: строка 1, столбец 7:
PLS-00306: неправильное количество или типы аргументов в вызове ‘DELETE_SEARCH’
ORA-06550: строка 1, столбец 7:
PL / SQL: оператор проигнорирован

Объявление процедуры является:

 PROCEDURE delete_search (user_ip IN VARCHAR2)
  

и код C #, который предполагает ее вызвать, является:

 OracleCommand cmd;
OracleParameter param;
for (int i = 0; i < data.Tables[0].Rows.Count; i  )
{
    if (decimal.Parse(data.Tables[0].Rows[i][1].ToString()) < numericUpDown1.Value)
    {
        cmd = new OracleCommand("delete_search", Form1.conn());
        cmd.Parameters.Clear();
        cmd.CommandType = CommandType.StoredProcedure;
        param = new OracleParameter();
        param.ParameterName = "ip";
        param.Value = data.Tables[0].Rows[i][0].ToString();
        param.Direction = ParameterDirection.Input;
        param.OracleType = OracleType.VarChar;
        cmd.Parameters.Add(param);
        Form1.adapter().SelectCommand = cmd;
        Form1.adapter().SelectCommand.ExecuteNonQuery();
    }
}    
  

и, конечно, исключение выдается в строке:

 Form1.adapter().SelectCommand.ExecuteNonQuery();
  

В чем может быть проблема?

Ответ №1:

не следует

 param.ParameterName = "ip";
  

быть

 param.ParameterName = "user_ip";
  

Комментарии:

1. Здесь вы, вероятно, правы. Однако обратите внимание, что OracleCommand по умолчанию выполняется привязка по порядку параметров и игнорируется имя, если только BindByName не установлено значение true. Однако я не знаю, предназначено ли это только для запросов или применимо и к хранимым процедурам: download.oracle.com/docs/html/E10927_01 /…

2. из . NET docs Использование параметров с SqlCommand — При использовании параметров с SqlCommand имена параметров, добавленных в коллекцию параметров, должны совпадать с именами маркеров параметров в вашей хранимой процедуре. Поставщик данных .NET Framework для SQL Server обрабатывает параметры в хранимой процедуре как именованные параметры и выполняет поиск соответствующих маркеров параметров.

3. полезно знать. Я знал, что BindByName это действует для обычных запросов, но не был уверен в сохраненных процедурах.

Ответ №2:

Вы передаете неправильное имя параметра. Это должно быть

 param.ParameterName = "user_ip";