【问题标题】:Can we have 2 different Oracle Dependency from 2 different database in a single asp.net application我们可以在单个 asp.net 应用程序中拥有来自 2 个不同数据库的 2 个不同的 Oracle 依赖项吗
【发布时间】:2018-06-16 03:50:45
【问题描述】:

我正在开发一个 asp.net web api 应用程序,我试图在 c# 中获取 oracle 数据库更改通知。但是当我初始化 1 个 oracle 依赖项时,一切都按预期工作,但是当我尝试从 2 个不同的 oracle 数据库初始化 2 个 oracle 依赖项时,我收到错误“'此操作需要使用对象相同的连接'"

var cmd = new OracleCommand("SELECT EMPNO FROM EMP r WHERE rownum <= 1 Order by EMPNO Desc", con1);
con1.Open();
cmd.AddRowid = true;
var dep = new OracleDependency(cmd);
dep.OnChange += new OnChangeEventHandler(dep_OnChange);
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());

var cmd2 = new OracleCommand("SELECT EMPNO FROM EMP2 r WHERE rownum <= 1 Order by EMPNO Desc", con2);
con2.Open();
cmd2.AddRowid = true;
var dep2 = new OracleDependency(cmd2);
dep2.OnChange += new OnChangeEventHandler(dep2_OnChange);
DataTable dt2 = new DataTable();
dt2.Load(cmd2.ExecuteReader());

【问题讨论】:

  • 为什么要设置第一个依赖,然后再将命令重用到 ExecuteReader 并将结果加载到数据表中?为什么不使用第三个连接和另一个命令呢?您的哪一行代码实际上引发了异常?
  • 您可以尝试查看链接服务器,然后您只需要一个连接
  • 是否可能为两个依赖项分配了相同的端口?您的第一个电话也应该是 ExecuteNonQuery,而不是填充数据表 - docs.oracle.com/cd/E11882_01/win.112/e23174/…

标签: c# asp.net oracle notifications


【解决方案1】:

首先,此分步指南可能会解决您的问题: Oracle Dependency Guide

其次,这也是您可以用来完成工作的另一项工作。 是的,可以。您的数据库层应包含 2 个将连接到相应数据库的类。另外不要使用ExecuteReader,而是使用DataAdapter,因为它自己处理Connection.Open()、Close()、Dispose()。

例如

DATABASE1.CS

public class Database1
{
    string sCon = string.Empty;
    OracleConnection OraCon;
    protected string query = string.Empty;
    public Database1()
    {
       sCon = "Data Source=(DESCRIPTION =(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST = 1.1.1.1)(PORT = 12345)))(CONNECT_DATA =(SID = SIDNAME)));User ID=username;Password=pass;";
       OraCon = new OracleConnection(sCon);
    }

    protected DataTable FillDataTableByParam(OracleParameter[] param)
    {
        DataTable oDT = new DataTable();
        OracleCommand OraCom = new OracleCommand(query, OraCon);
        OraCom.Parameters.AddRange(param);
        new OracleDataAdapter(OraCom).Fill(oDT);
        query = "";
        return oDT;
    }
}

DATABASE2.CS

public class Database2
{
    string sCon = string.Empty;
    OracleConnection OraCon;
    protected string query = string.Empty;
    public Database2()
    {
       sCon = "Data Source=(DESCRIPTION =(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST = 1.1.1.1)(PORT = 12345)))(CONNECT_DATA =(SID = SIDNAME2)));User ID=username;Password=pass;";
       OraCon = new OracleConnection(sCon);
    }

    protected DataTable FillDataTableByParam(OracleParameter[] param)
    {
        DataTable oDT = new DataTable();
        OracleCommand OraCom = new OracleCommand(query, OraCon);
        OraCom.Parameters.AddRange(param);
        new OracleDataAdapter(OraCom).Fill(oDT);
        query = "";
        return oDT;
    }
}

但您也可以在数据库层中保留 1 个类,使其可供 2 个数据库访问,它看起来像这样:

public class DatabaseLayer
    {
        string sCon = string.Empty;
        OracleConnection OraCon;
        protected string query = string.Empty;
        public DatabaseLayer(string DataBaseSecureName)
        {
           if(DataBaseSecureName ==  "One")
           {
            sCon = "Data Source=(DESCRIPTION =(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST = 1.1.1.1)(PORT = 12345)))(CONNECT_DATA =(SID = SIDNAME)));User ID=username;Password=pass;";
           }
           else if (DataBaseSecureName ==  "Second")
           {
            sCon = "Data Source=(DESCRIPTION =(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST = 1.1.1.1)(PORT = 12345)))(CONNECT_DATA =(SID = SIDNAME2)));User ID=username;Password=pass;";
           }

           OraCon = new OracleConnection(sCon);
        }

        protected DataTable FillDataTableByParam(OracleParameter[] param)
        {
            DataTable oDT = new DataTable();
            OracleCommand OraCom = new OracleCommand(query, OraCon);
            OraCom.Parameters.AddRange(param);
            new OracleDataAdapter(OraCom).Fill(oDT);
            query = "";
            return oDT;
        }
    }

您可以在我上面写的类/类中添加一个方法,以在连接更改时返回通知,然后随意使用它。

【讨论】:

  • 我的问题不是从 2 个不同的 oracle 数据库中获取数据,而是从 2 个不同的 oracle 数据库中启动两个 OracleDependency。
  • 您使用的是OracleDependency,而不是您可以尝试我回答的这种方法或您问题评论部分中分享的“WhatsThePoint”方法。
  • @ARr0w :我实际上也不明白您的方法如何在不使用OracleDependency 的情况下满足从数据库获取更改通知的需要。在@WhatsThePoint 评论中,它确实提供了一种解决方法,但没有解释使用两组完全独立的连接、命令、依赖项和数据表时出现问题的原因。
  • @Hilarion 由于他在使用预定义库时遇到问题,我为他提供了一种简单的方法来创建自己的库,以便从 OOP 的角度访问两个数据库。他正在使用的库必须做同样的事情,但有所不同,并且附加了一些额外的事件。
  • 这个问题专门针对Oracle Dependency,而不仅仅是访问两个Oracle DB 的一种方式。
猜你喜欢
  • 2020-01-22
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 2018-04-03
  • 2020-09-22
  • 2020-01-31
  • 1970-01-01
相关资源
最近更新 更多