首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle :请-00306:参数的错误数目或类型

Oracle :请-00306:参数的错误数目或类型
EN

Stack Overflow用户
提问于 2015-06-23 13:17:17
回答 1查看 1.1K关注 0票数 0

我使用Dapper和ODP.Net调用存储过程。我不知道我的参数有什么问题,我觉得很傻,但下面是这样的:

以下是存储过程签名:

代码语言:javascript
复制
PROCEDURE SP_NETWORK_GETALL(UserLogon IN VARCHAR2, NetworkVersionList OUT refCursor)

下面是我的.Net电话:

代码语言:javascript
复制
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。

我在堆栈溢出或互联网上见过无数这样的问题,但我看不出参数不匹配.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-24 13:23:47

问题是,您要向dapper的“参数”变量发送一个OracleParameter对象列表。Dapper是指与提供者无关的,并且您正在发送特定于提供程序的类型。

看看dapper代码中的GetCacheInfo方法,您将看到dapper试图处理参数的三种情况:

  1. IDynamicParameters的一个对象
  2. IEnumerable< KeyValuePair< string的一个对象,object>>
  3. Default/ the尝试在对象中查找与命令中的令牌匹配的属性。

您可能会陷入默认情况,但是由于您有一个proc,命令中没有标记,也没有添加任何参数。即使它们是,它也可能通过类型List<>的属性进行搜索,并且不会找到匹配的属性。

添加IDynamicParameters使您控制参数,这就是它工作的原因。这与odp.net无关。

我想这是我对dapper和所有ORMs的恼怒之一--尽管他们会努力尝试,但总会有一些特定于提供者的东西不能被抽象掉。这就是为什么我更喜欢简单地设置提供程序特定的命令,然后使用一个只执行映射的实用程序类(而不涉及到连接/安装/执行)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31003883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档