我正在尝试使用基于查询的通知,但由于某种原因,它似乎会切换到基于对象的通知。我的环境是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
,因此我希望不会收到任何通知。
我在这里错过了什么吗?
由于
答案 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'代替。
我注意到的是:
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(这是默认设置)。