using System; using System.Configuration; using System.Data; using System.Data.SqlClient; namespace SqlDependencyTest { class Program { private static string _connStr; static void Main(string[] args) { _connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ToString(); SqlDependency.Start(_connStr);//传入连接字符串,启动基于数据库的监听 UpdateGrid(); Console.Read(); } private static void UpdateGrid() { using (SqlConnection connection = new SqlConnection(_connStr)) { //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[] using (SqlCommand command = new SqlCommand("select ID,UserID,[Message] From [dbo].[Messages]", connection)) { command.CommandType = CommandType.Text; connection.Open(); SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); SqlDataReader sdr = command.ExecuteReader(); Console.WriteLine(); while (sdr.Read()) { Console.WriteLine("Id:{0}\tUserId:{1}\tMessage:{2}",sdr["ID"].ToString(), sdr["UserId"].ToString(), sdr["Message"].ToString()); } sdr.Close(); } } } private static void dependency_OnChange(object sender, SqlNotificationEventArgs e) { UpdateGrid(); } } }
在网上看到最多的就是这份代码,很有一个疑惑,就是没有出现事件的无限循环?在UpdateGrid函数中dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);多增加一个监听事件,而事件又调用UpdateGrid然后又会增加这个事件。测试了一下居然没有出错?表示很疑惑。。。有时候这种事件触发再调用增加事件就会出现触发多次。
在另一个项目中,两个ComboBox为combobox1和combobox2,都增加SelectedIndexChanged事件,然后为了两个ComboBox同步,在1的SelectedIndexChanged事件中写上combobox2.SelectedIndex=combobox1.SelectedIndex,另一个SelectedIndexChanged事件中写combobox1.SelectedIndex=combobox2.SelectedIndex
当时我也很害怕出现事件无限循环,但是运行却也没有问题。。。这让我对事件产生了疑惑,到底什么情况才会出现无限循环,什么情况又不出现。。。。
dependency 是临时变量~
并不是这个原因吧。写了一些代码,感觉像是利用command执行数据库然后就会插入消息队列,数据库有数据更新就会通知这个消息并从队列中移除。需要再执行一次数据库来重新插入一条消息。应该说是订阅,每次通过command订阅一次。但是下面的SelectedIndex我就不太清楚了