2016-06-06 4 views
2

У меня есть метод, который рекурсивно заполняет список. Сначала он выбирает родительские элементы, затем выбирает любые дочерние элементы, которые могут иметь внешние ключи. Он правильно выбирает родительские элементы, но когда он начинает собирать детей, тогда Reader закрывается без причины.MySQL Reader немедленно закрывается

Я проследил его в отладчике, и нет никаких причин, по которым я могу его закрыть. Параметры поиска действительны, поиск возвращает элементы (я проверил их вручную), и активен Reader. Однако по какой-то причине, как только он открывается, он закрывается без ошибок.

  • Строка подключения действует
  • Читатель действует
  • Параметры поиска действительны
  • Результаты команда возвращает (я тестировал этот конкретно - WHERE 1 = 1 AND SE.ParentSE = 4;"; имеет более 10 результатов)

Я не знаю, что происходит?

try 
{ 
    using (MySqlConnection connection = new MySqlConnection(GetConnectionString())) 
    { 
     connection.Open(); 

     using (MySqlCommand command = connection.CreateCommand()) 
     { 
      command.CommandText = @"SELECT 
            SE.SEId, 
            SE.Name, 
            SE.Status, 
            SE.Description, 
            SE.ParentME AS ParentMEId, 
            SE.ParentSE AS ParentSEId, 
            SE.Comments AS Comments, 
            SE.Removed AS Removed, 
            SE.SupplierId AS SupplierId, 
            TC.TerminalCount AS TerminalCount, 
            SE2.Name AS ParentSE, 
            ME.EquipmentNumber AS ParentME, 
            D.DSId AS DataSheet, 
            D.DSType AS DataSheetType, 
            C.Code AS EquipmentType, 
            C.Description AS TypeDescription, 
            C.CodeType AS TypeDiscipline, 
            SE.EquipmentType AS EquipTypeId, 
            SE3.SEId AS SE3Id, 
            SE4.SEId AS SE4Id, 
            SE5.SEId AS SE5Id, 
            SE6.SEId AS SE6Id, 
            SE2.ParentME AS ME2Id, 
            SE3.ParentME AS ME3Id, 
            SE4.ParentME AS ME4Id, 
            SE5.ParentME AS ME5Id, 
            SE6.ParentME AS ME6Id, 
            PAC.UDCId AS AreaCodeId, 
            PAC.Code AS AreaCode, 
            PAC.Description AS AreaCodeDescription 
           FROM SubEquipment SE 
           LEFT JOIN DataSheet D ON SE.SEId = D.SEId 
           LEFT JOIN (SELECT SEId, COUNT(*) as TerminalCount FROM Terminal GROUP BY SEId) TC ON SE.SEId = TC.SEId 
           LEFT JOIN SubEquipment SE2 ON SE.ParentSE = SE2.SEId 
           LEFT JOIN MajorEquipment ME ON SE.ParentME = ME.MEId 
           LEFT JOIN UserDefinedCode C ON C.UDCId = SE.EquipmentType 
           LEFT JOIN SubEquipment SE3 ON SE2.ParentSE = SE3.SEId 
           LEFT JOIN SubEquipment SE4 ON SE3.ParentSE = SE4.SEId 
           LEFT JOIN SubEquipment SE5 ON SE4.ParentSE = SE5.SEId 
           LEFT JOIN SubEquipment SE6 ON SE5.ParentSE = SE6.SEId 
           INNER JOIN MajorParentage MP ON SE.SEId = MP.SEId 
           INNER JOIN MajorEquipment MEU ON MP.MEId = MEU.MEId 
           INNER JOIN UserDefinedCode PAC ON MEU.PACId = PAC.UDCId 
           LEFT JOIN ComponentStatus CS1 ON CS1.StatusName = SE.Status 
           WHERE 1 = 1" 
           // " AND SE.ParentSE = @SEParentId"          
           // @SEParentId = 4 
           + parentSearch 
           + ";"; 

      command.Parameters.AddWithValue("@PACId", areaCodeId); 
      command.Parameters.AddWithValue("@AreaCode", areaCode.Cipher()); 
      command.Parameters.AddWithValue("@ETId", equipmentTypeId); 
      command.Parameters.AddWithValue("@EquipmentType", equipmentType.Cipher()); 
      command.Parameters.AddWithValue("@EquipmentNumber", equipmentNumber.Cipher()); 
      command.Parameters.AddWithValue("@Description", description.Cipher()); 
      command.Parameters.AddWithValue("@Comments", comments.Cipher()); 
      command.Parameters.AddWithValue("@TypeDiscipline", typeDiscipline); 
      command.Parameters.AddWithValue("@MEParentId", parentMEId); 
      command.Parameters.AddWithValue("@MEParent", parentMENumber.Cipher()); 
      command.Parameters.AddWithValue("@SEParentId", parentSEId); 
      command.Parameters.AddWithValue("@SEParent", parentSENumber.Cipher()); 
      command.Parameters.AddWithValue("@SEId", excludeSEId); 
      command.Parameters.AddWithValue("@Status", status.Cipher()); 

      using (MySqlDataReader reader = command.ExecuteReader()) 
      { 
       // Read all the results and populate a model with them. 
       while (reader.Read()) 
       { 
        // Do stuff... 
       } 
       // Finished reading the results 
       if (!reader.IsClosed) 
        reader.Close(); 
      } 
     } 

     // Finished with the connection 
     if (connection.State == System.Data.ConnectionState.Open) 
      connection.Close(); 
    } 
} 
catch (MySqlException e) 
{ 
    ShowMySQLError(e, 4417); 
} 
+1

Вы пытались не включать if-statements, чтобы закрыть Reader? – abramlimpin

+0

Я позволяю использовать с ресурсами, чтобы это сделать для меня. Что он сказал. – Drew

+0

Без изменений. Я просто бросил это в качестве меры предосторожности - наша команда очень предосудительна, у нас были проблемы с вещами, которые раньше не использовались. Я знаю, что 'using' обрабатывает его нормально, но давайте просто скажем, что мы параноики. – Ben

ответ

0

Обнаружено.

Этот метод использовался во многих местах всей программы; но почему-то это был этот звонок закрыл Reader неожиданно. При ближайшем рассмотрении свойства читателя показали, что у него не было строк: HasRows = false. Это означает, что в запросе было что-то не так.

Я снова посмотрел и обнаружил, что проблема была пропущенным параметром (который я урезал ради вопроса - я не думал, что это необходимо). Было несколько параметров по умолчанию boolean, для одного из них было установлено значение true, в результате чего запрос возвращал пустой результат.

Мораль истории: Поймите, что делает ваш код!