Member 11164890 Ответов: 0

При получении результатов с сервера произошла ошибка транспортного уровня. (Провайдер: Session provider, ошибка: 19-физическое соединение не используется)


Я разрабатываю веб-приложение с использованием VS 2013, framework 4.0.

Я получаю различные значения из таблицы в базе данных (количество извлеченных строк равно 282752). После этого я извлекаю несколько значений из разных таблиц на основе различных значений, которые я получил.

Ошибка, которую я получаю при запуске этого кода, такова:

A transport-level error has occurred when receiving results from the server. (provider: session Provider, error:19 - Physical connection is not usable)




Есть ли способ реализовать мой код без этой ошибки?


Следующий код объясняет, что именно я делаю.
public void GetData()
      {
          string yard_date = "08/30/2015 16:00:00";
          string chosen_from_date = "01/10/2016 23:00:00";
          string chosen_to_date = "01/10/2016 23:00:00";
          List<string> unit_ids = new List<string>();
          //  int count = 0;

          using (SqlConnection connection2 = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstring"].ConnectionString))
          {
              connection2.Open();

              string sql2 = "select distinct id from inv_unit where category <> 'THRGH'";

              SqlCommand command2 = new SqlCommand(sql2, connection2);

              SqlDataReader reader2 = command2.ExecuteReader();


              while (reader2.Read())
              {

                  string unit_no = reader2.GetValue(0).ToString();
                  unit_ids.Add(unit_no);
              }
              reader2.Close();
          }

          Response.Write("IN");

          using (SqlConnection connection3 = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstring"].ConnectionString))
          {
              connection3.Open();
              //count for each block
              int count_1a = 0;
              int count_1a_20 = 0;
              int count_1a_40 = 0;
              foreach (string id in unit_ids)
              {
                  foreach (DateTime date in RangeOfDates(chosen_from_date, chosen_to_date))
                  {
                      string sql3 = "SELECT TOP 1 inv_unit_fcy_visit.gkey, ref_equipment.length_mm, inv_move_event.t_put, inv_move_event.to_pos_loctype, inv_move_event.to_pos_slot "
                                      + "FROM inv_unit, inv_unit_fcy_visit, inv_unit_equip, ref_equipment, inv_move_event "
                                      + "WHERE inv_unit.gkey = inv_unit_fcy_visit.unit_gkey AND inv_unit.gkey = inv_unit_equip.unit_gkey AND inv_unit_equip.eq_gkey = ref_equipment.gkey AND "
                                      + " inv_unit_fcy_visit.gkey = inv_move_event.ufv_gkey AND inv_unit.id = '" + id + "' AND  inv_move_event.t_put <= '" + date + "' "
                                      + "ORDER BY inv_move_event.t_put DESC";

                      SqlCommand command3 = new SqlCommand(sql3, connection3);

                      SqlDataReader reader3 = command3.ExecuteReader();

                      while (reader3.Read())
                      {
                          // string length_ft = reader3.GetValue(1).ToString();
                          string to_pos_slot = reader3.GetValue(4).ToString();

                          if (to_pos_slot != "")
                          {
                              double length_ft = Math.Round((Convert.ToDouble(reader3.GetValue(1).ToString())) / 304.8, 0);

                              string to_pos_loctype = reader3.GetValue(3).ToString();
                              char block_char = Convert.ToChar(to_pos_slot.Substring(0, 1));
                              if (to_pos_loctype == "YARD" && Char.IsDigit(block_char))
                              {
                                  string block = to_pos_slot.Substring(0, 2);

                                  if (length_ft == 20)
                                  {
                                      if (block == "1A")
                                      {
                                          count_1a++;
                                          count_1a_20++;
                                      }

                                  }
                                  else if (length_ft == 40)
                                  {
                                      if (block == "1A")
                                      {
                                          count_1a++;
                                          count_1a_40 += 2;
                                      }

                                  }
                                  else if (length_ft == 45)
                                  {
                                      if (block == "1A")
                                      {
                                          count_1a++;
                                          count_1a_40 += 2;
                                      }

                                  }

                                  // Response.Write("IN");
                              }
                          }

                      }

                  }
              }

              Response.Write("count1:  " + count_1a + "   cpunt2:   " + count_1a_20 + "   count3" + count_1a_40);

          }
          //  }


          //  }
      }


Что я уже пробовал:

Я проверил, чтобы запустить следующий SQL-запрос на основе конкретных заданных значений отдельно в Microsoft SQL server Management studio, и он работает нормально.

Выберите TOP 1 inv_unit_fcy_visit.gkey, ref_equipment.length_mm, inv_move_event.t_put, inv_move_event. to_pos_loctype, inv_move_event.to_pos_slot
Из inv_unit, inv_unit_fcy_visit, inv_unit_equip, ref_equipment, inv_move_event
Где inv_unit.ГК = inv_unit_fcy_visit.unit_gkey и inv_unit.ГК = inv_unit_equip.unit_gkey и inv_unit_equip.eq_gkey = ref_equipment.ГК и
inv_unit_fcy_visit.ГК = inv_move_event.ufv_gkey и inv_unit.идентификатор = 'ZFRU2211874 и inv_move_event.t_put &ЛТ;= '08/09/2015 23:00:00'
Заказ по inv_move_event.t_put алфавиту

Однако он выходит из строя и отображает ошибку только на странице code behind в моем веб-приложении.

[no name]

Как насчет вашей строки подключения? Проверьте с помощью post в этой ссылке, чтобы увидеть, работает ли это для вас.

http://stackoverflow.com/questions/22714569/cannot-get-rid-of-physical-connection-is-not-usable-exception

an0ther1

Где вы получаете ошибку?
Это в первом запросе или во втором? Если он находится во втором запросе, то завершается ли он вообще успешно?
Если первый запрос завершается успешно, то ваша строка подключения должна быть в порядке для второго запроса, поэтому проблема заключается либо в том, что вы пытаетесь использовать закрытое соединение (второй запрос выполняется один раз, но затем не повторяется), либо в вашем запросе (второй запрос возвращает ошибку при первом запуске), либо в какой-то другой проблеме (второй запрос испытывает ошибку при первом запуске).
Вещи, которые вы можете попробовать;
а) переместите код; SqlConnection connection3 = новый SqlConnection(...) внутри вашей петли foreach (идентификатор строки в unit_ids)
Это гарантирует, что вы избавитесь от своего соединения, как только получите результат, закройте его.
б)перепишите свой запрос. Из того, что я вижу, вы просматриваете серию инвентарных кодов и дат, чтобы получить свои данные, каждый раз повторно запрашивая базу данных и беря только верхний результат. Это не очень хорошая практика - в зависимости от того, какой метод RangeOfDates() вероятно ли, что вы дублируете результаты - конечно, есть лучший способ получить необходимые вам данные - например, вы используете одни и те же даты для каждого кода, поэтому вам лучше передать диапазон дат для каждого кода вместо того, чтобы выполнять запрос для каждого значения кода и даты

с уважением

ZurdoDev

Похоже, это может быть проблема со строкой подключения.

0 Ответов