У меня возникли трудности с попыткой вызвать функцию моего DBA внутри C#. Он отлично работает в браузере запросов Oracle, однако, когда я пытаюсь выполнить его на C#, он терпит неудачу.Невозможно выполнить функцию пакета Oracle в C#
Самая распространенная ошибка: "ORA-06502: PL/SQL: числовые или значение ошибки: строка символов, буфер слишком мал ORA-06512: в строке 1"
Я попытался увеличить размер параметров C#, но не имеет успеха. Не уверен, что я делаю неправильно.
C# Код:
string returnValue = string.Empty;
using (OracleConnection cn = new OracleConnection("ConnectionString"))
{
using (OracleCommand cmd = new OracleCommand())
{
cmd.Connection = cn;
cmd.CommandText = "package.function";
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter param1 = new OracleParameter();
OracleParameter param2 = new OracleParameter();
OracleParameter param3 = new OracleParameter();
OracleParameter param4 = new OracleParameter();
OracleParameter param5 = new OracleParameter();
param1.OracleDbType = OracleDbType.Varchar2;
param1.Direction = ParameterDirection.Input;
param1.Value = "Test808";
param1.ParameterName = "var1";
//param1.Size = 2000;
param2.OracleDbType = OracleDbType.Varchar2;
param2.Direction = ParameterDirection.Input;
param2.Value = "68B54814";
param2.ParameterName = "var2";
//param2.Size = 2000;
param3.OracleDbType = OracleDbType.Varchar2;
param3.Direction = ParameterDirection.Input;
param3.Value = "71839";
param3.ParameterName = "var4";
//param3.Size = 2000;
param4.OracleDbType = OracleDbType.Varchar2;
param4.Direction = ParameterDirection.Input;
param4.Value = 55 ;
param4.ParameterName = "var4";
//param4.Size = 2000;
param5.OracleDbType = OracleDbType.Varchar2;
param5.Direction = ParameterDirection.ReturnValue;
param5.ParameterName = "return";
//param5.Size = 2000;
cmd.Parameters.Add(param1);
cmd.Parameters.Add(param2);
cmd.Parameters.Add(param3);
cmd.Parameters.Add(param4);
cmd.Parameters.Add(param5);
try
{
cn.Open();
cmd.ExecuteNonQuery();
returnValue = cmd.Parameters["return"].Value.ToString();
}
catch
{
}
finally
{
cn.Close();
}
}
}
return returnValue;
Функция Заголовок:
FUNCTION create_rec
(p_mims_pallet_id varchar2
,p_item_no varchar2
,p_packer_id varchar2
,p_tare_wt varchar2
)
return varchar2
первый раз пытается Oracle называет. Никогда не было проблем с SQL. Параметр.Size закомментирован, поскольку ничего не делает.
Удалось заставить его работать, удалив отдельные параметры и создав им метод Parameter.Add.
Рабочий код:
string returnValue = string.Empty;
using (OracleConnection cn = new OracleConnection("ConString"))
{
using (OracleCommand cmd = new OracleCommand())
{
cmd.Connection = cn;
cmd.CommandText = "package.function";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("rv", OracleDbType.Varchar2, 200, "", ParameterDirection.ReturnValue);
cmd.Parameters.Add("var1", OracleDbType.Varchar2, 20, "Test808", ParameterDirection.Input);
cmd.Parameters.Add("var2", OracleDbType.Varchar2, 20, "68B54814", ParameterDirection.Input);
cmd.Parameters.Add("var3", OracleDbType.Varchar2, 20, "71839", ParameterDirection.Input);
cmd.Parameters.Add("var4", OracleDbType.Decimal, 55, ParameterDirection.Input);
try
{
cn.Open();
cmd.ExecuteNonQuery();
returnValue = cmd.Parameters["rv"].Value.ToString();
}
catch
{
}
finally
{
cn.Close();
}
}
}
return returnValue;
проверка на VARCHAR2 размеры полей, которые вы пытаетесь вставить/обновить и сравнить со значениями вы проходящими. – cableload
Я уверен, что вы должны дать именам параметров C# те же имена, что и имена Oracle, поэтому вместо, например, 'param1.ParameterName =" var1 ";' try 'param1.ParameterName =" p_mims_pallet_id ";' и так на. Это не объясняет ошибку, о которой вы сообщали, но вы упомянули, что у вас есть другие. Что касается параметра 'Size', я просто удостоверяюсь, что он, по крайней мере, достаточно большой для значения, которое я передаю; больше должно быть хорошо. –
Я проверил структуру таблицы, и все проверено. Я считаю, что это что-то с кодом C# на этом этапе. Если он отлично работает в конце Оракула при вызове из SQL-браузера, то я должен делать что-то неправильно. Просто не вижу этого. Изменены все имена параметров для их уважаемых имен заголовков и по-прежнему имеют ту же ошибку. Также изменился формат .Size до 2000 и вызывается такая же ошибка. –