using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
private static string connectionString = ConfigurationManager.ConnectionStrings[“ConnStr”].ToString();
static void Main(string[] args)
{
SqlDependency.Start(connectionString);//传入连接字符串,启动基于数据库的监听
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();
}
}
https://bbs.csdn.net/topics/392303039
例子:https://blog.csdn.net/u012183487/article/details/77776930
sql语句
CREATE TABLE [dbo].[Messages](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] varchar COLLATE Chinese_PRC_CI_AS NOT NULL,
[Message] nvarchar COLLATE Chinese_PRC_CI_AS NOT NULL,
CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
)
解释与注意的:SqlDependency的sql语句比较严格列名必须写,不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,而且表名之前必须加类似dbo这样的前缀等等
你说的轮训根本不会,只有第一次的时候才会把全部读一下,之后只有更新的才能被读到,你不放心的话可以自己测试下,也可以自己家WHERE条件 ID大于多少多少这样。。。
----写了一些代码,感觉像是利用command执行数据库然后就会插入消息队列,数据库有数据更新就会通知这个消息并从队列中移除。需要再执行一次数据库来重新插入一条消息。应该说是订阅,每次通过command订阅一次。但是下面的SelectedIndex我就不太清楚了