При получении результатов с сервера произошла ошибка транспортного уровня. (Провайдер: 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
Похоже, это может быть проблема со строкой подключения.