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