为什么回发花费太长时间才能从链接的服务器检索数据

时间:2019-10-18 11:32:00

标签: c# asp.net linked-server autopostback textchanged

我正在使用具有网格视图和内部网格视图的门户网站,我有两个文本框,名称分别为txtEmployeeNumber和txtEmployeeName。而且我在txtEmployeeNumber上创建了一个事件text_changed,以便在回发第二个文本后将填充相应的数据,例如EmployeeName,请指导我在此方面进行哪些更改。我尝试了OPENQUERY,它在源(链接服务器)上已处理,但不能正常工作。还有什么其他方法可以尽快检索数据。

我还分别在页面和UpdatePanel内部使用跟踪和触发器

Trace="true"

<Triggers> <asp:AsyncPostBackTrigger ControlID="txtEmployeeNumber" EventName="TextChanged" /> </Triggers>

在我的aspx页面中进行快速回发,但没有发现任何变化

我的存储过程

CREATE procedure [dbo].[SP_Get_Employee_Name]  
 @Employee_ID nvarchar(max)  
AS  
BEGIN  

 DECLARE @emp_name nvarchar(max)  
 SELECT @emp_name = Employee_Name FROM [938.987.644.336].[something].[dbo].[tbl_Employee]  
 WHERE Personnel_Number= @Employee_ID  

 IF (@emp_name is  null or @emp_name = '')  
 BEGIN  
  SELECT @emp_name = Name from [938.987.644.336].[something].[dbo].[tbl_Contract1_Employee]  
  WHERE [Unique id]= '110'+ @Employee_ID  
 END  

 SELECT @emp_name AS Employee_Name  
END

C#代码:

protected void txtEmployeeNumber_TextChanged(object sender, EventArgs e)
        {
            string EmployeeNo = "";
            foreach (GridViewRow row in grdRegister.Rows)
            {
                if (row.RowType != DataControlRowType.DataRow)
                    continue;

                EmployeeNo = (row.Cells[1].FindControl("txtEmployeeNumber") as TextBox).Text;

                SqlCommand cmd = new SqlCommand("SP_Get_Employee_Name", Con.OpenConnection());
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Employee_ID", EmployeeNo);
                Con.OpenConnection();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);
                if (dt.Rows.Count > 0)
                {
                    (row.Cells[2].FindControl("txtEmployeeName") as TextBox).Text = dt.Rows[0]["Employee_Name"].ToString();
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

首先,您需要确定阻塞区域,然后才能优化搜索。这里发生了三种情况:

  1. 文本更改事件引发了轰动。
  2. 在C#中服务器上的文本更改事件。
  3. 从sql服务器检索数据。

在大多数情况下,阻塞发生在第2点和第3点。现在,最好的解决方案是在服务器中一次检索数据,并在这种情况下保留在应用程序变量或javascript会话中(如果不是太多)您可以避开第2点和第3点。

但是,如果您有太多数据,请尝试使用datareader而不是数据集,因为它比数据集快。尝试这些并分享您的结果。

还有一点我想说的是,在每个字母输入上都击中了服务器,我认为您需要找到一种方法,以使每个字母输入中的每个字母都不会集体出现。我在我的一个项目中遇到了它,因此我使用了一些jquery库。