gpt4 book ai didi

oracle - Oracle 中基于 ODP.NET 查询的通知

转载 作者:行者123 更新时间:2023-12-01 08:03:58 28 4
gpt4 key购买 nike

我正在尝试使用基于查询的通知,但由于某种原因,它似乎切换到了基于对象的通知。我的环境是 Oracle 11.2(我相信您需要 11.1 或更高版本才能进行基于查询的工作),并且我有一个 select 语句,它检索一个类型为 NUMBER 的列。 (在这里我的理解是只有 varchar2 和 number 列有效)。我似乎在表格上收到了所有更改通知,而不仅仅是我的过滤数据集

作为示例,我创建了一个名为 test_db_notification 的示例表,其中包含一个类型为 NUMBER 的列。

在其中添加了两个条目,如下所示:

SELECT rowid,column1 FROM test_db_notification;

ROWID COLUMN1

AAAERnAAKAAEurNAAI 54
AAAERnAAKAAEurPAAA 63

这是我注册通知的代码:
OracleCommand _cmdObj = _connObj.CreateCommand();
_cmdObj.CommandText = " SELECT column1 FROM test_db_notification where column1 = 63";
_dep = new OracleDependency(_cmdObj);
_dep.QueryBasedNotification = true;
_dep.OnChange += new OnChangeEventHandler(_dep_OnChange);
_cmdObj.Notification.IsNotifiedOnce = false;
_cmdObj.AddRowid = true;
_cmdObj.ExecuteNonQuery();

当我注册并更改当前值为 54 的 column1 的值时,我收到一条通知,指出 54 的 ROWID 已更新。
我原以为不会收到任何通知,因为我的原始查询仅查看 column1 = 63 .

我在这里错过了什么吗?

谢谢

最佳答案

在 StackOverflow 上发布答案永远不会太晚,因为人们(包括我自己)从提出问题的几年开始就一直在寻找东西。这可能不是您正在寻找的答案,但认为它可能会引导您朝着正确的方向前进。我没有足够的积分来发表“评论”,所以我输入这个作为答案。

为了重现问题,我创建了一个表

CREATE TABLE TEST_DB_NOTIFICATION
(
COLUMN1 VARCHAR2(1 BYTE),
COLUMN2 VARCHAR2(1 BYTE)
)

我使用了以下 .Net 代码(对您的代码稍作改动)
private void button1_Click(object sender, RoutedEventArgs e)
{
OracleConnection _connObj = new OracleConnection("Data Source=mydb;User Id=myid;Password=mypassword;");
_connObj.Open();
OracleCommand _cmdObj = _connObj.CreateCommand();
_cmdObj.CommandText = " SELECT column1 FROM ods.test_db_notification where column1 = 'a' ";
OracleDependency _dep = new OracleDependency(_cmdObj);
_dep.QueryBasedNotification = true;
_dep.OnChange += new OnChangeEventHandler(_dep_OnChange);
_cmdObj.Notification.IsNotifiedOnce = false;
_cmdObj.AddRowid = true;
_cmdObj.ExecuteNonQuery();
}

void _dep_OnChange(object sender, OracleNotificationEventArgs eventArgs)
{
MessageBox.Show("changed" + eventArgs.Details.Rows.Count);
}

基本上,我正在做和你一样的事情,但我正在关注 Column1='a' 。

我注意到如下:

** 插入行为 **

1) 当我插入表格时,当新行的 Column1 值 = 'a' 时,我会收到通知。
2) 当 Column1 值不是“a”时,我没有收到通知。

** 更新行为 **

1) 当我更新表格导致 Column1 中的现有值从非“a”值更改为“a”时,我会收到通知。
2) 我收到通知,为什么我将值已经为“a”的列再次更改为“a”。
3) 如果我将 Column1 上的值从“a”更改为“z”,我会收到通知。

**删除行为**

1) 当我删除 Column1 值 = 'a' 的行时,我会收到通知
2) 当 Column1 值不是“a”时,我没有收到通知

这使我得出一个明显的结论,即如果对符合您正在查看的语句的结果的行有任何更改(包括对自身现有值的覆盖的更改),您会收到通知。这与 INSERT、UPDATE 和 DELETE 的行为一致。

关于oracle - Oracle 中基于 ODP.NET 查询的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172214/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com