Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#OracleDependency OnChange多次触发_C#_.net_Oracle - Fatal编程技术网

C#OracleDependency OnChange多次触发

C#OracleDependency OnChange多次触发,c#,.net,oracle,C#,.net,Oracle,据我所知,OracleDependency可以绑定到监视查询(而不仅仅是表)。我创建了2个command对象和2个dependency对象,但这两个对象的查询都有不同的where子句,因此它们应该查看该表的2个不同子集 我将这两个依赖项对象分配给同一个回调。我的期望是,当我更改表中的某些内容时,这些依赖项对象中的一个正在监视OnChange事件是否会触发该事件。然后,我可以在OnChange事件中执行以下操作,以获取触发更改的查询: OracleDependency OraDep=(Oracl

据我所知,OracleDependency可以绑定到监视查询(而不仅仅是表)。我创建了2个command对象和2个dependency对象,但这两个对象的查询都有不同的where子句,因此它们应该查看该表的2个不同子集

我将这两个依赖项对象分配给同一个回调。我的期望是,当我更改表中的某些内容时,这些依赖项对象中的一个正在监视OnChange事件是否会触发该事件。然后,我可以在OnChange事件中执行以下操作,以获取触发更改的查询:


OracleDependency OraDep=(OracleDependency)发送方;
字符串sql=(字符串)OraDep.RegisteredResources[0];

因此,我使用不同的where子句值对同一个表设置了两个查询。然后我进入数据库并更改其中一个,但令我惊讶的是,OnChange甚至触发了两次,上面的查询代码显示了两个查询


是否无法获得特定查询的依赖项而不是整个表的依赖项?我想我在某个地方读到了您为特定查询设置的内容,where子句和all。

Oracle更改通知监视对象而不是查询。表上的任何更改—插入、更新或删除新记录、添加新列、重命名/删除新记录。这就是为什么你会看到2次通知的原因

一种方法是调用存储过程而不是查询。只接受1个通知。通知事件e.info告诉您它是插入/更新/删除操作。因此,您可以编写一个if条件,仅响应插入通知,并根据该条件调用相应的sp或查询


希望这有帮助。

我想我有个问题。在这个变化事件中,我需要知道发生了什么变化。我似乎看不到任何东西来显示这些信息。这似乎很奇怪,因为我看到的例子中,他们通过的cmd上有where子句,但我可以看到情况并非如此,但这仍然让我需要知道我的C#应用程序发生了什么变化。让我澄清一下“什么变化”的含义。我指的是更改的记录(当消息类型为update时),而不仅仅是表更改的内容(因为我设置了cmd,所以我知道这一点)。@user441521,因为您只对更新感兴趣。在事件处理程序中,u可以有一个if条件来if(e.info.ToString()=“Update”){Process}else ignore。是的,这还不足以知道更新了什么记录。不过我想出来了。在附加到依赖项对象的命令对象中,将include行id设置为true,然后在依赖项onchange的回调事件args中,可以获取oracle行id并查询表以获取更改的记录。谢谢