【发布时间】:2015-09-09 07:36:51
【问题描述】:
我正在使用 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。
我在 stackoverflow 或互联网上看到过一百万个这样的问题,但我在这里看不到参数不匹配...
【问题讨论】:
-
是否需要架构名称?
-
好吧,我只是尝试不使用架构名称,但我得到了同样的错误,所以我认为这不是问题......
-
这个错误的常见原因是ODP.NET默认是按位置绑定的,而不是按参数名绑定的。这似乎不是这里的问题,但如果您提供给我们的过程不是实际的,请确保您以正确的顺序绑定或将 Bindbyname 设置为 true。接下来,确保“refcursor”是 oracle 类型。我虽然正确的类型是 SYS_Refcursor。如果它实际上是一个用户定义的类型,而不是一个简单的 ref_cursor 你不能像这样绑定。也许您应该向我们提供该过程的实际创建语句。
-
这篇文章很旧,但你应该看看,看看你在做什么不同。因为你有一个帮助类来绑定和执行,所以很难说你哪里出错了:oracle.com/technetwork/articles/dotnet/…
-
好吧,我设法做了一些有效的事情。我按照post 的建议创建了一个实现 SqlMapper.IDynamicParameters 的类。它在命令执行之前添加参数。我没有更改参数声明并且它可以工作......我在这里在 ODP.Net 中闻到了一些可疑的东西。如果有人有更好的解决方案,我会保留这个问题......无论如何,谢谢克里斯蒂安
标签: .net oracle stored-procedures dapper odp.net