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

时间:2011-11-17 18:17:40

标签: oracle odp.net

我正在尝试使用基于查询的通知,但由于某种原因,它似乎会切换到基于对象的通知。我的环境是Oracle 11.2(我相信您需要11.1或更高版本才能使查询工作)并且我有一个select语句,它会检索NUMBER类型的列。 (再次,我的理解是只有varchar2和数字列可以工作)。我似乎在桌面上得到了每个更改通知,而不仅仅是我的flltered数据集

作为示例,我创建了一个名为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,因此我希望不会收到任何通知。

我在这里错过了什么吗?

由于

2 个答案:

答案 0 :(得分:1)

在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'代替。

我注意到的是:


** INSERT行为**

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


**更新行为**

1)当我更新表格时,导致Column1中的现有值更改为' a'来自非 - '价值,我得到通知。 2)我收到通知,为什么我要更改其值已经是' a'成为一个'再次。 3)如果我更改了' a'到' z'在Column1上。


**删除行为**

1)当我删除Column1值=' a' 2)当Column1值不是' a'

时,我不会收到通知

这使我得出一个明显的结论:如果对正在观察的语句的结果有资格的行有任何更改(包括覆盖现有值的更改),则会收到通知。这与INSERT,UPDATE和DELETE的行为一致。

答案 1 :(得分:0)

基于查询的通知afaik不会捕获插入内容。如果您想捕获那些将_dep.QueryBasedNotification设置为false(这是默认设置)。