C# 在一个asp.net应用程序中,是否可以从两个不同的数据库中获得两个不同的Oracle依赖关系

C# 在一个asp.net应用程序中,是否可以从两个不同的数据库中获得两个不同的Oracle依赖关系,c#,asp.net,oracle,notifications,C#,Asp.net,Oracle,Notifications,我正在开发一个asp.NETWebAPI应用程序,试图在其中获得c语言中的oracle数据库更改通知。但是,当我初始化1个oracle依赖项时,一切正常,但当我尝试从2个不同的oracle数据库初始化2个oracle依赖项时,我收到一个错误“此操作要求对象使用相同的连接” 首先,本分步指南可能会解决您的问题: 其次,这也是你可以用来完成工作的另一项工作。 是的,可能有。您的数据库层应该包含两个类,它们将连接到相应的数据库。另外,不要使用ExecuteReader,而是使用DataAdapter

我正在开发一个asp.NETWebAPI应用程序,试图在其中获得c语言中的oracle数据库更改通知。但是,当我初始化1个oracle依赖项时,一切正常,但当我尝试从2个不同的oracle数据库初始化2个oracle依赖项时,我收到一个错误“此操作要求对象使用相同的连接”


首先,本分步指南可能会解决您的问题:

其次,这也是你可以用来完成工作的另一项工作。 是的,可能有。您的数据库层应该包含两个类,它们将连接到相应的数据库。另外,不要使用ExecuteReader,而是使用DataAdapter,因为它处理连接。打开、关闭、自行处置

比如说

数据库1.CS

数据库2.CS

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

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;
        }
    }

您可以使用逻辑向我上面编写的类添加一个方法,以在连接更改时返回通知,然后根据需要使用它。

为什么要设置第一个依赖项,然后再将命令重用到ExecuteReader,并将结果加载到datatable中?为什么不使用第三个连接和另一个命令呢?哪一行代码会引发异常?您可以尝试查看链接的服务器,然后只需要一个连接是否可能为两个依赖项分配了相同的端口?您的第一个调用应该是ExecuteOnQuery,未填充数据表-我的问题不是从2个不同的oracle数据库中获取数据,而是从2个不同的oracle数据库中启动两个OracleDependency。您使用的是OracleDependency。您可以尝试我回答的方法,或者尝试问题的注释部分中该点共享的方法。@ARr0w:实际上我也没有了解您的方法如何满足在不使用OracleDependency的情况下从DB获得更改通知的需要。在@WhatstThePoint注释中,它确实提供了一种解决方法,但没有解释在使用两组完全不同的连接、命令、,依赖项和数据表。@Hilarion因为使用预定义库有困难,所以我给了他一个简单的方法来创建自己的库,以便从OOP的角度访问两个数据库。他使用的库必须做相同的事情,但不同,并且附带了一些附加事件。问题是专门针对Oracle依赖关系的,而不仅仅是访问两个Oracle数据库的方法。
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;
    }
}
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;
    }
}
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;
        }
    }