我正在尝试使用基于查询的通知,但由于某种原因似乎切换到了基于对象的通知。我的环境是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();

当我注册并更改column1的值(当前值为54)时,我得到一条通知,告知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 value ='a'的行时,我得到通知
2)当Column1的值不是'a'时,我不会收到通知

这使我得出一个显而易见的结论:如果符合您正在查看的语句结果的行发生了任何更改(包括对现有值本身进行覆盖的更改),则会收到通知。这与INSERT,UPDATE和DELETE的行为一致。

10-07 16:10
查看更多