dbms_output.Put_line в c # Dapper - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно вернуть переменную oracle в C #, однако я использую Dapper, так есть ли способ получить вывод через dapper?

Я пробовал вот так

ORACLE    ...
            ,NULL                                                               /*CLIENTE_GRUPO_CPF*/
            ,'P'                                                                /*LOTE_PRODUCAO_PEDIDO*/
            ,'N'                                                                /*LIBERACAO_COMERCIAL*/
            ,NULL                                                               /*USUARIO_LIB_COMERCIAL*/
            ,NULL                                                               /*DATA_LIB_COMERCIAL*/
            ,NULL                                                               /*HORA_LIB_COMERCIAL*/
            ,'L'                                                                );
    COMMIT;
    dbms_output.put_line(var_zi_controle_id);
    END ;


C#  
var id = conn.QueryFirstOrDefault<int>(sql);

но таким образом ответ будет 0.

1 Ответ

0 голосов
/ 17 мая 2018

Использование dbms_output.put_line(var_zi_controle_id); для вывода переменной неверно, это не будет работать с языками программирования / драйвером базы данных, такими как ODP.Net, это для печати и проверки консоли.

Dapper состоит из набора методов расширения, которые расширяют IDbConnection интерфейс ADO.Net, для Oracle внутри вы должны заполнить ODP.Net - OracleConnection объект, теперь, когда вы проверяете руководство ODP.Net для вызова любого из PL Хранимые процедуры SQL, у вас есть следующие опции:

  1. Привязать параметр Output или Return и заполнить параметр в процедуре PL SQL. Используя Dapper, вам нужно DynamicParameter для привязки параметров рядом с Input, как Output / Return
  2. Другой вариант - это способ, которым вы сейчас пытаетесь, вы ожидаете, что оператор Select вернет значение как целое число, так что вам нужно Select var_zi_controle_id в процедуре, которая будет выглядеть как QueryResult, но все же вам потребуется Тип T, который содержит целочисленное значение, здесь вы получите класс / класс с одним целочисленным свойством var_zi_controle_id. Query<T> хотя и возвращает IEnumerable<T>

Мой предпочтительный способ - добавить параметр Output, назначить его в хранимой процедуре и получить значение, проверить ссылки внизу для хорошей справки. Простой пример будет:

 var dynamicParameters = new DynamicParameters();
 dynamicParameters.Add("var_zi_controle_id",0,DbType.Int32,ParameterDirection.Output)

Parameter Direction опции InputOutput и ReturnValue также могут использоваться, но ReturnValue требуется явное возвращаемое значение из процедуры

// Выполнить хранимую процедуру

conn.Execute(@"ProcedureName", dynamicParameters, commandType: CommandType.StoredProcedure);

// Выбор значения параметра O / p из dynamicParameters

var id = dynamicParameters.Get<int>("var_zi_controle_id");

Важно, чтобы параметр Output var_zi_controle_id, который связывается с хранимой процедурой, был задан до возврата вызова для значения, которое нужно извлечь

Связывание параметров OracleCommand SQL

https://docs.oracle.com/database/121/ODPNT/OracleCommandClass.htm#ODPNT458

https://docs.oracle.com/cd/E11882_01/win.112/e23174/OracleParameterClass.htm#ODPNT1722

...