我正在使用具有网格视图和内部网格视图的门户网站,我有两个文本框,名称分别为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();
}
}
}
答案 0 :(得分:0)
首先,您需要确定阻塞区域,然后才能优化搜索。这里发生了三种情况:
在大多数情况下,阻塞发生在第2点和第3点。现在,最好的解决方案是在服务器中一次检索数据,并在这种情况下保留在应用程序变量或javascript会话中(如果不是太多)您可以避开第2点和第3点。
但是,如果您有太多数据,请尝试使用datareader而不是数据集,因为它比数据集快。尝试这些并分享您的结果。
还有一点我想说的是,在每个字母输入上都击中了服务器,我认为您需要找到一种方法,以使每个字母输入中的每个字母都不会集体出现。我在我的一个项目中遇到了它,因此我使用了一些jquery库。