我使用SqlDependency
的查询通知,这是方案:
我有一个包含100条记录的小表,但这些记录中的数据非常大
以下是代码:
private void AutoUpdate()
{
SqlDependency.Stop(connectionstring);
SqlDependency.Start(connectionstring);
using (SqlConnection cn = new SqlConnection(connectionstring))
{
using (SqlCommand cmd = cn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = @"Select [Number], [Creation date],[Createdby], [Approved] from [dbo].[MyTable] Order By Number";
dt = new DataTable();
cmd.Notification = null;
SqlDependency dep = new SqlDependency(cmd);
dep.OnChange += new OnChangeEventHandler(dep_OnChange);
cn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
dt.Load(dr);
}
dataGridView1.DataSource = dt;
}
}
}
对于OnChange
事件,我使用以下代码
private void dep_OnChange(object sender, SqlNotificationEventArgs e)
{
if (this.InvokeRequired)
{
dataGridView1.BeginInvoke(new MethodInvoker(AutoUpdate));
}
else
{
AutoUpdate();
}
SqlDependency dep = sender as SqlDependency;
dep.OnChange -= new OnChangeEventHandler(dep_OnChange);
}
如果用户更改了我的Datagridview中的任何值,我还会使用CellValueChanged
事件来触发
问题是:当用户更改一个单元格的值时,它会更新数据库,然后触发OnChange
事件,导致重新加载包含所有记录的所有数据表
想象一下,用户想要为前50个记录填充值{0'的NUMBER
字段
用户只需按下箭头键,然后按键盘上的键0,这将导致发送和接收大量数据,因为应用程序将在每次按下后从数据库接收数据表,并在尝试时我经历了一个非常缓慢的表现
是否有更好的方法来实现查询通知?
有没有办法让OnChange
事件仅适用于受影响的行?不是整张桌子?