Параметр C# ODB.NET Out всегда DBNull
У меня есть хранимая процедура в пакете в Oracle SQL Server. Эта процедура имеет входные и выходные параметры. Сама процедура работает, и при выполнении в Oracle SQL Developer выходной параметр считывает ожидаемый результат (значение столбца последней строки). Эта процедура должна вызываться веб-API через ODP.NET (Oracle Managed Data Access).
Проблема: Выходной параметр (типа 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;
}
Как видите, я знаю, как проверить значение DBNull, но это не проблема. Не предполагается получить значение DBNull.
Некоторые вещи, которые я пробовал до сих пор:
- Измените параметр DBType на Int64 и другие (с другими я правильно получаю ошибку о типе параметра)
- Установите event_id, жестко запрограммированный со значением (event_id:= 1234567;)
- Выполните запрос SELECT MAX(... вне процедуры непосредственно в базе данных).
Все, что я пытаюсь, хотя SQL Developer работает как положено. Проблемы с передачей параметра Output в вызывающий C# API. Я много гуглил и искал в Stackru, так что я надеюсь, что кто-нибудь может помочь мне с ответом, который работает.
1 ответ
Как уже упоминалось в моем вопросе, я попытался изменить DbType параметра Output на Int64. При просмотре я заметил, что был еще один (IN OUT) параметр, который был объявлен как DbType.Long. При смене одного я не менял другого, так что, видимо, все равно выдавал ошибку.
Я получил ошибку:
ORA-06502: PL / SQL: ошибка числового значения или значения: слишком маленький буфер строки символов
Решение: Измените все параметры OracleDbType.Long на OracleDbType.Int64.
Такой простой ответ задним числом. Тем не менее я не понимаю, почему это проблема.
Разве Long не должен быть тем же или псевдонимом для Int64?
Извините, что беспокою вас, и я ценю время, которое вы потратили, чтобы попытаться помочь. :)
Я надеюсь, что кто-то может исправить их (аналогичные) проблемы с моим вопросом / ответом.