C# SqlDependency性能缓慢

C# SqlDependency性能缓慢,c#,sqldependency,C#,Sqldependency,我使用SqlDependency的查询通知,下面是场景: 我有一个小表,有100条记录,但这些记录中有相当大的数据 代码如下: private void AutoUpdate() { SqlDependency.Stop(connectionstring); SqlDependency.Start(connectionstring); using (SqlConnection cn = new SqlConnection(connectionstring)) {

我使用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事件,这会导致重新加载包含所有记录的所有datatable

假设用户希望用值“0”填充数字字段,用于前50条记录

用户只需连续按键盘上的向下箭头键,然后按0键,这将导致发送和接收大量数据,因为应用程序将在每次按下后从数据库接收数据表,而在尝试此操作时,我体验到了非常缓慢的性能

有没有更好的方法来实现查询通知


有没有办法使OnChange事件只在受影响的行上工作?不是整个表?

您不应该在每次更改后使用OnChanged事件更新数据库,而是应该有一个事件,例如“更新数据库”按钮或关闭应用程序时的更新,该事件将在一批中执行所有数据库更新。不断地与数据库交谈会产生很大的噪音,并导致您遇到的性能下降。@Saggio这是一个多用户应用程序。。。其他用户必须同时看到更改,并发性在我的应用程序中非常重要调用SqlDependency.Start/Stop可能对性能没有帮助。;SQL依赖项不会告诉您更改了哪些数据。也许,只需选择count*,就可以阻止它提取数据。使用触发器实现更改跟踪。让触发器插入有关其他表更改的信息。更改跟踪也可以工作,但会有延迟。或者更好的做法是,让应用程序插入更改跟踪信息,而不是使用触发器。@usr first:您认为调用SqlDependency.Start(应用程序启动时启动)和调用SqlDependency.Stop(应用程序退出时停止)有助于提高性能吗?我尝试的方式第二,我不知道什么是变更跟踪或者如何实现它,我将搜索它并尝试看到不同之处,如果你有一些快速的方法,我会很感激的