我需要将一个变量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。
答案 0 :(得分:1)
使用dbms_output.put_line(var_zi_controle_id);
输出变量不正确,这对于ODP.Net等编程语言/数据库驱动程序不起作用,这适用于控制台打印和验证。
Dapper
包含一组扩展方法,它扩展了ADO.Net的IDbConnection
接口,在Oracle内部为您填写ODP.Net - OracleConnection
对象,现在当您检查ODP.Net指南时要调用任何PL SQL存储过程,您有以下选项:
DynamicParameter
Select
语句将值返回为整数,因此您需要的是程序中的Select var_zi_controle_id
,它将作为QueryResult,但是你仍然需要一个Type T,它包含一个整数值,在这里你会得到一个带有一个整数属性var_zi_controle_id
的Type / class。 Query<T>
虽然会返回IEnumerable<T>
我的首选方法是添加输出参数,在存储过程中分配并检索值,检查下面的链接以获得良好的参考。一个简单的例子是:
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);
//从dynamicParameters
var id = dynamicParameters.Get<int>("var_zi_controle_id");
重要的是,在调用返回之前设置绑定到存储过程的输出参数var_zi_controle_id
,以获取要提取的值
OracleCommand SQL Parameters Binding
https://docs.oracle.com/database/121/ODPNT/OracleCommandClass.htm#ODPNT458
https://docs.oracle.com/cd/E11882_01/win.112/e23174/OracleParameterClass.htm#ODPNT1722