У меня есть хранимая процедура внутри пакета в Oracle SQL Server. Эта процедура имеет входные и выходные параметры. Сама процедура работает и при выполнении в Oracle SQL Developer выходной параметр считывает ожидаемый результат (значение столбца последней строки). Эта процедура должна вызываться веб-API через ODP.NET (Oracle Managed Data Access).C# ODB.NET Необязательный параметр всегда DBNull
Проблема: выходной параметр (типа Long в ODP и NUMBER (12,0) в db) никогда не возвращается. Выходным параметром всегда является DBNull после выполнения команды.
Ниже приведены соответствующие части моего кода (другие параметры опущены): Процедура Пакет:
PROCEDURE post_event (event_id OUT OPIS_REGISTRATIE_PROJ.PROJECT_ID%TYPE)
IS BEGIN
-- Some stuff that's happening (that works)
SELECT MAX(PROJECT_ID) INTO event_id FROM OPIS_REGISTRATIE_PROJ WHERE PERSOON_ID = worksheet_id;
END;
Параметр, который используется:
parameters.Add(new OracleParameter("event_id", OracleDbType.Long, ParameterDirection.Output));
Вызывающий код в C#:
if (con.State == ConnectionState.Open)
{
// Create command and set parameters
using (var cmd = new OracleCommand(cmdText, con))
{
cmd.CommandType = CommandType.StoredProcedure;
foreach (var p in parameters)
{
cmd.Parameters.Add(p);
}
// Execute the stored procedure
try
{
cmd.ExecuteNonQuery();
}
catch (OracleException ex)
{
Console.WriteLine(ex.Message);
}
long paramEventId = 0;
if (cmd.Parameters["event_id"].Value != DBNull.Value)
{
paramEventId = (long)(OracleDecimal)cmd.Parameters["event_id"].Value;
}
Как вы можете видеть, я знаю, как проверить наличие D BNull значение, но это не проблема. Он не должен получать значение DBNull.
Некоторые вещи, которые я пытался до сих пор:
- Изменение параметров DBTYPE в Int64 и другие (с другими я правильно получить ошибку о типе параметра)
- Установите event_id жёстко со значением (event_id:.. = 1234567;)
- Выполнить SELECT MAX (... запрос вне процедуры непосредственно в базе данных
Все, что я пытаюсь хотя SQL Developer работает, как ожидалось Это передача параметра Output в вызывающий C# API, который имеет проблемы. Я много искал и искал Stackoverflow, поэтому я надеюсь, что кто-то может помочь мне с ответом, который работает.
Можете ли вы добавить информацию о состоянии вашего параметра C# out (значения свойства) перед выполнением запроса? – Igor
Закройте соединение перед чтением значения параметра. – Steve
@Igor Я не уверен, что вы имеете в виду/как я могу это сделать. Значение параметра равно нулю, так как это выходной параметр. После выполнения он переходит в DBNull. Стив, Спасибо за подсказку, я об этом не думал. К сожалению, это не решает мою проблему. Кроме того, у меня есть другие процедуры, которые работают почти одинаково, не закрывая соединение (что необходимо, поскольку эти процедуры используют рефлекторные курсоры). – DevvoX