【问题标题】:Using Database Change Notification on multiple tables在多个表上使用数据库更改通知
【发布时间】:2021-07-04 03:11:14
【问题描述】:

我正在用 C# 开发一个应用程序,并尝试使用 Oracle 数据库更改通知。

当我对一个表使用 DCN 时,一切都按预期工作,但是当我尝试使用两个表时,我收到以下错误:“尝试读取或写入受保护的内存。这通常表明其他内存已损坏”,在命令行 cmd.ExecuteNonQuery();

代码如下:

string sql = "select rowid, first_name, last_name, salary from employees where employee_id = :1" +
                 "select country_id, country_name, region_id from countries where country_id = :2";
string constr = "User Id=hr;Password=Parola_007;Data Source=ORCL;Pooling=false";
con = new OracleConnection(constr);
con.Open();
OracleCommand cmd = new OracleCommand(sql, con);

OracleParameter p_id = new OracleParameter();
p_id.OracleDbType = OracleDbType.Decimal;
p_id.Value = 149;
OracleParameter p_id2 = new OracleParameter();
p_id2.OracleDbType = OracleDbType.Varchar2;
p_id2.Value = "BE";

cmd.BindByName = true;
cmd.Parameters.Add(p_id);
cmd.Parameters.Add(p_id2);

OracleDependency dep = new OracleDependency(cmd);
cmd.Notification.IsNotifiedOnce = false;
dep.OnChange += new OnChangeEventHandler(OnDatabaseNotification);
cmd.ExecuteNonQuery();

    public static void OnDatabaseNotification(object src, OracleNotificationEventArgs args)
    {
        string sql = "select rowid, first_name, last_name, salary from employees where rowid = :1" +
                         "select rowid, country_id, country_name, region from countries where rowid = :2";

        OracleParameter p_rowid = new OracleParameter();
        p_rowid.Value = args.Details.Rows[0]["rowid"];
        OracleParameter p_rowid2 = new OracleParameter();
        p_rowid2.Value = args.Details.Rows[1]["rowid"];

        OracleCommand cmd = con.CreateCommand();
        cmd.CommandText = sql;
        cmd.BindByName = true;
        cmd.Parameters.Add(p_rowid);
        cmd.Parameters.Add(p_rowid2);

        OracleDataReader dr = cmd.ExecuteReader();
        dr.Read();

        Console.WriteLine();
        Console.WriteLine("Database Change Notification received!");
        DataTable changeDetails = args.Details;
        Console.WriteLine("Resource {0} has changed.", changeDetails.Rows[0]["ResourceName"]);
        Console.WriteLine("Resource {1} has changed.", changeDetails.Rows[1]["ResourceName"]);

        dr.Dispose();
        cmd.Dispose();
        p_rowid.Dispose();
    }

我是不是做错了什么?

谢谢。

【问题讨论】:

  • 我没有在 C# 中完成 DCN,但我通常不能使用单个句柄向 Oracle 发送两个单独的、独立的语句。我希望您为这两个语句(即sql_1sql_2)、单独的命令等提供两个单独的变量。

标签: c# .net database oracle notifications


【解决方案1】:

1:您不能在 1 个命令中执行 2 个 sql。 2:可以使用oracle中的表触发器来检查变化的表数据。所有更改都应该记录在一个表中,并且只需要从该表中查询。 对不起我的英语

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多