Параметр 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?

Извините, что беспокою вас, и я ценю время, которое вы потратили, чтобы попытаться помочь. :)
Я надеюсь, что кто-то может исправить их (аналогичные) проблемы с моим вопросом / ответом.

Другие вопросы по тегам