我使用Dapper和ODP.Net调用存储过程。我不知道我的参数有什么问题,我觉得很傻,但下面是这样的:
以下是存储过程签名:
PROCEDURE SP_NETWORK_GETALL(UserLogon IN VARCHAR2, NetworkVersionList OUT refCursor)下面是我的.Net电话:
using (var conn = new OracleConnection(connString))
{
var parameters = new List<OracleParameter>
{
new OracleParameter()
{
Direction = ParameterDirection.Input,
ParameterName = "UserLogon",
OracleDbType = OracleDbType.Varchar2,
Size = 4000,
Value = "TEST"
},
new OracleParameter()
{
Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.RefCursor,
ParameterName = "NetworkVersionList",
Value = DBNull.Value
},
};
var results = conn.Query("SDTM.PKG_SP_GET.SP_NETWORK_GETALL", parameters, commandType: CommandType.StoredProcedure);
}我试过这个存储过程,它有效。我在其他存储过程中使用了Dapper,它也能工作。我已经尝试更改参数的顺序(首先是参考游标),设置VarChar2参数的大小,或者不设置引用游标的DBNull.Value。
我在堆栈溢出或互联网上见过无数这样的问题,但我看不出参数不匹配.
发布于 2015-06-24 13:23:47
问题是,您要向dapper的“参数”变量发送一个OracleParameter对象列表。Dapper是指与提供者无关的,并且您正在发送特定于提供程序的类型。
看看dapper代码中的GetCacheInfo方法,您将看到dapper试图处理参数的三种情况:
您可能会陷入默认情况,但是由于您有一个proc,命令中没有标记,也没有添加任何参数。即使它们是,它也可能通过类型List<>的属性进行搜索,并且不会找到匹配的属性。
添加IDynamicParameters使您控制参数,这就是它工作的原因。这与odp.net无关。
我想这是我对dapper和所有ORMs的恼怒之一--尽管他们会努力尝试,但总会有一些特定于提供者的东西不能被抽象掉。这就是为什么我更喜欢简单地设置提供程序特定的命令,然后使用一个只执行映射的实用程序类(而不涉及到连接/安装/执行)。
https://stackoverflow.com/questions/31003883
复制相似问题