2016-06-06 16 views
2

Ich habe eine Methode, die rekursiv eine Liste auffüllt. Zuerst werden die übergeordneten Elemente ausgewählt und anschließend unter Verwendung von Fremdschlüsseln eventuell vorhandene untergeordnete Elemente ausgewählt. Es wählt die übergeordneten Elemente fein aus, aber wenn es beginnt, die Kinder auszuwählen, schließt sich die Reader ohne Grund.MySQL Reader schließt sofort

Ich habe es im Debugger durchgegangen, und es gibt keinen Grund, dass ich sehen kann, dass es schließt. Die Suchparameter sind gültig, die Suche gibt Elemente zurück (ich habe sie manuell überprüft) und Reader ist aktiv. Aus irgendeinem Grund schließt es jedoch, sobald es geöffnet wird, ohne Fehler.

  • Die Verbindungszeichenfolge ist gültig
  • Der Reader ist gültig
  • Die Suchparameter gültig sind
  • Der Befehl gibt Ergebnisse (ich dieses speziell getestet - WHERE 1 = 1 AND SE.ParentSE = 4;"; hat mehr als 10 Treffer)

Ich weiß nicht, was los ist?

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

Haben Sie versucht, die if-Anweisungen nicht zu schließen, um den Reader die Verbindung zu schließen? – abramlimpin

+0

Ich lasse die Verwendung mit Ressourcen es für mich abziehen. Was er sagte. – Drew

+0

Keine Änderung sowieso. Ich habe das vorsorglich aufgegeben - unser Team ist sehr vorsichtig, wir hatten Probleme mit Dingen, die wir vorher nicht hatten. Ich weiß, 'using' behandelt es normalerweise, aber sagen wir einfach, wir sind paranoid. – Ben

Antwort

0

Es gefunden.

Diese Methode wurde an mehreren Stellen im gesamten Programm verwendet. aber aus irgendeinem Grund war es nur dieser Anruf, der die Reader unerwartet geschlossen wurde. Bei näherer Betrachtung - die Eigenschaften des Lesers zeigten, dass es keine Reihen hatte: HasRows = false. Das bedeutet, dass mit der Abfrage etwas nicht stimmt.

Ich schaute wieder, und fand, dass das Problem ein übersehener Parameter war (den ich für die Frage zurechtgeschnitten habe - ich dachte nicht, dass es notwendig war). Es gab einige Standardwerte boolean, einer wurde auf True festgelegt, wodurch die Abfrage ein leeres Ergebnis zurückgibt.

Moral der Geschichte: Verstehen Sie, was Ihr Code tut!

Verwandte Themen