Почему Post Back занимает слишком много времени для получения данных со связанного сервера - PullRequest
0 голосов
/ 18 октября 2019

Я работаю с порталом, который имеет сетку и внутри сетки, у меня есть два текстовых поля, которые можно назвать как txtEmployeeNumber и txtEmployeeName. И я создал событие text_changed на txtEmployeeNumber, чтобы после публикации второго текста были заполнены соответствующие данные, такие как 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 голосов
/ 18 октября 2019

Прежде всего, вам нужно определить область блокировки, затем только вы оптимизируете свой поиск. Здесь происходит три сценария:

  1. Просмотр события изменения текста запускается браузером.
  2. Событие изменения текста на сервере в C #.
  3. Получение данных с сервера sql.

В большинстве случаев блокировка происходит в пунктах 2 и 3. Теперь лучшее решение - извлечь данные один раз на сервере и сохранить в переменной приложения или в сеансе javascript (если его не слишком много)) в этом случае вы можете избежать пунктов 2 и 3.

Но если у вас слишком много данных, попробуйте использовать datareader вместо набора данных, так как он быстрее, чем набор данных. Попробуйте их и поделитесь своими результатами.

Еще один момент, который я хочу сказать, что при каждом наборе букв вы попадаете на сервер. Я думаю, что вам нужно найти способ, чтобы вместо каждого из них вы набирали каждую букву. коллективно. Я столкнулся с этим в одном из моих проектов, поэтому я использовал для этого библиотеку jquery.

...