OracleCommand cmd =
new OracleCommand("select * from Test WHERE TestFLAG = 1 or TestFLAGis not null", con);
当表格发生变化时,无论条件如何,我的.net项目仍会收到通知。
对于第二个问题,在我第一次收到任何通知后,表格上的任何更改都不会被通知。为什么呢?
我的问题的任何解决方案?
public class MyNotificationSample
{
static string constr = "your db INFO";
public static bool IsNotified = false;
static OracleDependency dep = null;
public static void Main(string[] args)
{
//To Run this sample, make sure that the change notification privilege
//is granted to scott.
OracleConnection con = null;
try
{
con = new OracleConnection(constr);
OracleCommand cmd = new OracleCommand("select * from Test WHERE TestFLAG = 1 or TestFLAGis not null", con);
con.Open();
// Set the port number for the listener to listen for the notification
// request
OracleDependency.Port = 1005;
// Create an OracleDependency instance and bind it to an OracleCommand
// instance.
// When an OracleDependency instance is bound to an OracleCommand
// instance, an OracleNotificationRequest is created and is set in the
// OracleCommand's Notification property. This indicates subsequent
// execution of command will register the notification.
// By default, the notification request is using the Database Change
// Notification.
dep = new OracleDependency(cmd);
// Add the event handler to handle the notification. The
// OnMyNotification method will be invoked when a notification message
// is received from the database
dep.OnChange += OnMyNotificaton;
// The notification registration is created and the query result sets
// associated with the command can be invalidated when there is a
// change. When the first notification registration occurs, the
// notification listener is started and the listener port number
// will be 1005.
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
con.Close();
Console.Write("Press Any Key to Quit");
Console.ReadLine();
// Loop while waiting for notification
}
public static void OnMyNotificaton(object src,
OracleNotificationEventArgs arg)
{
if (dep.HasChanges)
{
Console.WriteLine("Notification Received");
DataTable changeDetails = arg.Details;
Console.WriteLine("Data has changed in {0}",
changeDetails.Rows[0]["ResourceName"]);
}
}
最新更新:让听众永不过期。
new OracleDependency(cmd, false, 0 , true);
但是,我的查询仍无效...
答案 0 :(得分:1)
将此添加到您的代码
cmd.Notification.IsNotifiedOnce = false;
答案 1 :(得分:1)
您的查询包含以下WHERE
子句:TestFLAG = 1 or TestFLAGis not null
。
TestFLAG
和is not null
之间可能缺少空格。在这种情况下,表达式的第一部分是不必要的,就像TestFLAG = 1
时那样,它不是null。
也许问题在于,您的查询覆盖的范围超出了您的预期。
除此之外,Oracle的数据库更改通知功能不能保证,您只会收到有关查询实际返回的行的通知。这样可以保证您将获得有关这些行的通知,但您也可能会获得“误报”,因此,实际上与不匹配的行将得到通知。
这可能是Oracle Docs(强调我的意思)的很好解释:
基于查询的注册有两种模式:保证模式和 尽力而为模式。在保证模式下,任何数据库更改通知 确保查询中包含的内容发生更改 结果集。但是,如果查询很复杂,则不能 在保证模式下注册。在这种情况下,将使用“尽力而为”模式。
尽力而为模式简化了基于查询的注册的查询。没有 简化会丢失通知。然而 简化可能导致误报,因为较简单的版本 当原始查询结果可能会更改查询结果 仍然没有限制。 尽力而为模式基于查询的注册。在这种情况下,开发人员 可以使用基于对象的注册,它可以注册大多数查询 类型。基于对象的注册会在以下情况下生成通知: 即使实际查询结果没有更改,查询对象也会更改。这个 也意味着基于对象的注册更容易出错 比基于查询的注册更具优势。开发人员应注意 每个数据库的相对优势和劣势的变化 通知选项,然后选择最适合他们的选项 要求。
在第二个问题上,正如@user1415516所写,您需要将通知设置为在第一次通知后不注销,因此在执行命令之前添加cmd.Notification.IsNotifiedOnce = false;
。