#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";