在我的应用程序中,我已经从.net核心项目中的nuget软件包安装了Dapper。我运行一个程序。我在调试模式下看到该参数接收到该值,但无法读取该值。
public decimal AddMaster(MaterialMaster req)
{
decimal id = 0;
try
{
var dynamicParam = new OracleDynamicParameters();
var conn = this.GetConnection();
if (conn.State == ConnectionState.Closed)
{ conn.Open(); }
if (conn.State == ConnectionState.Open)
{
dynamicParam.Add("P_CAL_ID", OracleDbType.Decimal, ParameterDirection.InputOutput);
dynamicParam.Add("P_MATERIAL_KOD", OracleDbType.Varchar2, ParameterDirection.Input, req.MATERIAL);
dynamicParam.Add("P_SEZON_KOD", OracleDbType.Varchar2, ParameterDirection.Input, req.SEASON);
dynamicParam.Add("P_CURRENCY_ID", OracleDbType.Decimal, ParameterDirection.Input,0);
dynamicParam.Add("P_FABRIKA_KOD", OracleDbType.Varchar2, ParameterDirection.Input, req.PLANT_ID);
dynamicParam.Add("P_STATUS", OracleDbType.Decimal, ParameterDirection.Input,1);
dynamicParam.Add("P_EKLEYEN_KULLANICI", OracleDbType.Decimal, ParameterDirection.Input, 60950);
dynamicParam.Add("P_EKLENEN_TARIH", OracleDbType.Date, ParameterDirection.Input, new DateTime());
dynamicParam.Add("P_GUNCELLEYEN_KULLANICI", OracleDbType.Decimal, ParameterDirection.Input, 60950);
dynamicParam.Add("P_GUNCELLENEN_TARIH", OracleDbType.Date, ParameterDirection.Input, new DateTime());
dynamicParam.Add("P_CUSTOMER_ID", OracleDbType.Decimal, ParameterDirection.Input, req.CUSTOMER_ID);
var x = SqlMapper.Query(conn, "BMS.PA_CALCULATION_TOOL.INS_CAL_COST_CAL_MASTER", param: dynamicParam, commandType: CommandType.StoredProcedure).SingleOrDefault();
id = dynamicParam.Get<OracleDecimal>("P_CAL_ID");//<==This line throws error
}
return id;
}
catch(Exception ex)
{
return id;
}
}
id = dynamicParam.Get<OracleDecimal>("P_CAL_ID");
上一行引发错误。
没有发现Get方法为错误。
如何解决此错误。我无法联系到P_CAL_ID
。
答案 0 :(得分:1)
我从未将Dapper与Oracle一起使用,但是我可以看到代码中的以下改进。
如here所述,Get
是通用方法。
public T Get<T>(string name)
所以,也许您应该像下面这样阅读它:
OracleDecimal oraid = dynamicParam.Get<OracleDecimal>("P_CAL_ID");
,然后将其转换为原生decimal
类型。
我不确定,但是可能您需要将参数方向更改为Output
:
dynamicParam.Add("P_CAL_ID", OracleDbType.Decimal, ParameterDirection.Output);