public partial class Form1 : Form { public Form1() { InitializeComponent(); } System.Data.SqlClient.SqlConnection conn = null; System.Data.SqlClient.SqlCommand command = null; // Set connection string SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder { // set server DataSource = @"datasource name", // set database InitialCatalog = @"catalog name", // access the database using the existing windows security certificate IntegratedSecurity = true }; private void Form1_Load(object sender, EventArgs e) { conn = new System.Data.SqlClient.SqlConnection(builder.ConnectionString); command = conn.CreateCommand(); command.CommandText = "select id,name from dbo.tabletest where id<>20 order by id desc "; // Start SqlDependency.Start(builder.ConnectionString); // Get data GetData(); } private void GetData() { command.Notification = null; SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(sqlDependency_OnChange); using (SqlDataAdapter adapter = new SqlDataAdapter(command)) { System.Data.DataSet ds = new DataSet(); adapter.Fill(ds, "test"); dataGridView1.DataSource = ds.Tables["test"]; } } void sqlDependency_OnChange(object sender, SqlNotificationEventArgs e) { // Because it is a child thread, you need to update the ui with the invoke method. if (this.InvokeRequired) { this.Invoke(new OnChangeEventHandler(sqlDependency_OnChange), new object[] { sender, e }); } else { SqlDependency dependency = (SqlDependency)sender; dependency.OnChange -= sqlDependency_OnChange; // After the notification, the current dependency is invalid, you need to re-get the data and set the notification. GetData(); } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { // Clear resource SqlDependency.Stop(builder.ConnectionString); conn.Close(); conn.Dispose(); } }
Result: