【问题标题】:ODP.NET Stored Procs and Optional ParametersODP.NET 存储过程和可选参数
【发布时间】:2011-11-13 04:59:43
【问题描述】:

我尝试搜索并没有找到我的问题的明确答案。我正在从 SQL Server 切换到 Oracle,但仍然使用 C# 作为前端。我正在使用 ODP.Net。我在 Oracle 中有一个这样的存储过程:

Create or Replace
Procedure GetFoo
   (cur_z OUT sys_refcursor,
    pub_date   IN   varchar2,
    fname      IN   varchar2 default null,
    lname      IN   varchar2 default null,
    phone      IN   varchar2 default null
   )
 IS
  BEGIN
    ---get some data
  END;

fname、lname 和phone 是可选参数。在我的 C# 代码中,我设置了 OracleCommand.BindByName = true ,我已经阅读过它应该允许我排除发送任何没有要发送的值的参数。例如,我只需要发送游标 pub_date和电话以搜索仅与电话号码匹配的记录。但是,当从 C# 调用它并且只添加光标、pub_date 和电话的参数时,我不断收到错误消息:“调用 'GetFoo' 时争论的数量或类型错误。然后,如果我发送光标、pub_date 和fname 并将其余部分留空我得到结果并且一切正常。似乎无论 BindByName 设置如何,您都不能跳过任何参数。如果这是正确的行为,那么我可以解决它,但它似乎有点奇怪(在至少从我的 SQL Server 经验来看),我想确保我没有遗漏任何东西。

谢谢。

【问题讨论】:

  • 只是想知道您是否尝试过跳过一些参数并在 OracleCommand.BindByName 后面添加注释来执行 sp?

标签: c# .net oracle stored-procedures odp.net


【解决方案1】:

AFAIK BindByName 旨在用于按位置绑定...它与任何默认参数或类似参数无关...

【讨论】:

  • 谢谢。因此,如果您的 SP 中有可选参数,则无论如何都必须通过 ODP.NET 发送它们,对吧?
【解决方案2】:

根据我的经验,BindByName 不适用于存储过程 - 仅适用于查询。

但这对你来说真的不重要。无论如何,您应该只从应用程序中的单个方法调用此 SP。在该方法的签名中使用默认参数,并始终将所有参数传递给 ODP.Net。

object GetFoo(DateTime pubDate, string fName = null, string lName = null, string phone = null)
{

}

这样做,忘掉它,把时间花在更重要的问题上。

【讨论】:

    【解决方案3】:

    默认情况下,存储过程中与 Oracle 参数的绑定仅基于位置。

    这意味着您必须按照在过程中声明的顺序添加参数,Oracle 不会关心您设置参数的名称。

    当您将绑定设置为 BindByName 时,您可以按任意顺序添加参数,只要它们具有相同的名称即可。在我看来,这比默认设置要好得多。

    但是,将 BindByName 设置为 True 或 False 不会影响参数是否需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多