【问题标题】:Replacing TableAdapters with Oracle.DataAccess.Client (ODP.NET)用 Oracle.DataAccess.Client (ODP.NET) 替换 TableAdapter
【发布时间】:2015-08-30 08:19:43
【问题描述】:

我有一个带有大约 100 个 TableAdapter (DataSet xsd) 的旧 DAL,但是因为我们使用 Oracle 客户端 12c 获得了新服务器,所以我不得不从旧的不推荐使用的 System.Data.OracleClient 切换到 Oracle.DataAccess.Client (ODP.NET)。

我现在唯一的问题是我在调用表适配器时总是得到一个错误:ORA-01008: Not all variables bound

我读到我必须为每个 TableAdapter 在OracleCommand 中将BindByName 设置为true。但是,当唯一使用 OracleCommand 的地方是 TableAdapter 本身的设计器时,我该怎么做呢?

有没有办法在不扩展每个 TableAdapter 的情况下做到这一点,因为我有 100 个。

【问题讨论】:

  • 所以,你说,这是设计师。这意味着在您的每个表单或控件上都有一个?使用一些数据访问层怎么样?
  • 正如我所说,这是一个遗留代码库,一开始设计得不是很好。有一个带有 TableAdapter 的 DAL,然后有一个带有 WCF 服务的 BLL,它返回这些 TableAdapter,所以所有的 TableAdapter 一直到 UI。但现在这不是问题,因为我们正试图一步一步地向前迈进,而这一次是从弃用的System.Data.OracleClient 切换到新的Oracle.DataAccess.Client。但是这个BindByName 很难,因为我们有大约 100 个 TableAdapter。
  • 您能否发布一些代码 sn-ps 以及产生该错误的确切代码?问题可能不在您认为的位置。我记得 System.Data.OracleClient 在管理绑定变量方面非常出色,尽管我不记得语法是否与主流 ODP 语法有什么不同。
  • 据我所知,BindByName 是命令的属性,而不是适配器。因此,您可以像以前一样继续传递您的适配器。您在数据访问中需要做的就是用返回命令的方法替换每个命令,并且在此方法中,只需对所有代码库“bindbyname”执行一次
  • @T.S. OracleCommand 硬连线到每个 TableAdapter 设计器中。这会产生问题。

标签: c# oracle odp.net tableadapter system.data.oracleclient


【解决方案1】:

我所做的是扩展了每个 TableAdapter 并创建了一个新的 SetBindByName() 方法,我在 OracleCommand 集合上强制使用了 BindByName = true

就这样……

public partial class V_CUSTOMER_GLOBALTableAdapter
{
    public void SetBindByName(bool value = true)
    {
        foreach (Oracle.DataAccess.Client.OracleCommand cmd in this.CommandCollection)
        {
            cmd.BindByName = value;
        }
    }
}

然后,当我创建 TableAdapter 的一个实例时,我调用了新的SetBindByName() 方法。

V_CUSTOMER_GLOBALTableAdapter ta = new V_CUSTOMER_GLOBALTableAdapter();
ta.SetBindByName(true);

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多