2017-12-27 18 views
0
SqlCommand myCommand = new SqlCommand(command, myConnection); 
using (SqlDataReader myReader = myCommand.ExecuteReader()) 
{ 
    while (myReader.Read()) 
    { 
     Item item = new Item(); 
     try { cost = double.Parse(myReader["Cost"].ToString()); } catch { /* logging */ } 
     item.Cost = cost; 
     list.Add(item); 
    } 
} 

return list; 

ich den obigen Code haben, wenn im Debug-Modus lief es ausführt perfekt, aber wenn ich Visual Studio wechseln Profil auf Release, es gibt nur eine Liste von etwa 500 Artikel , wenn es 3-4x sein sollte.C# SqlDataReader Freisetzungsprofil Schließen Datareader früh (Fehler)

Meine SQLClass erstellt und öffnet eine neue SqlConnection (myConnection) beim Erstellen der Klasse und disposed es in einem Destruktor.

Ich kann keine Hinweise auf diese Art von Verhalten finden, aber es funktioniert einwandfrei in Debug. Ich habe catch-Anweisungen um es zu versuchen und einen Fehler zu fangen, es wirft gelegentlich einen "sqlDataReader geschlossen" -Fehler, jedoch die meiste Zeit wirft es nicht einmal einen Fehler. Wirklich harter Bug zu replizieren, aber in der Veröffentlichung in einem brandneuen Projekt, gibt es immer noch eine Liste von weniger als korrekte Datenmenge.

Ich habe den Fehler repliziert, indem ich eine neue Klassenbibliothek mit dem Problemcode erstellt habe. Das Erstellen der DLL im Freigabemodus verursacht keine Probleme. Wenn ich die Testkonsolen-Anwendung in debug ausführen, funktioniert es gut (auch mit kompilierter DLL aus Release-Modus) Allerdings Debug-Modus nicht die richtige Anzahl von Ergebnissen zurückgeben.

+0

Ist der leere 'catch' ein Tippfehler oder ist das wirklich im Code? – Equalsk

+0

Dies ist keine Antwort, sondern anstelle von 'try {cost = double.Parse (myReader [" Cost "]. ToString()); } catch {} 'use' double.TryParse' –

+0

Ich habe den Code etwas verkleinert, um das Problem mit einer einzigen Beispielvariablen anzuzeigen. Der Catch hat einige einfache Fehler Logging in der realen Code – Jeax

Antwort

0

Putting Bemerkungen von Kommentaren zusammen, kam ich mit dem Code auf, die Sie versuchen sollten:

int cost = 0; 
Item item; 
while (myReader.Read()) 
{ 
    double.TryParse(myReader["Cost"].ToString(), out cost); 
    item = new Item(){Cost = cost}; 
    list.Add(item); 
} 
0

Vielen Dank für die Anregungen jedermanns Sache.

Stellt fest, dass die Klassendestruktormethode aufgerufen wurde, während die while (myReader.Read()) noch ausgeführt wird, was zu einem Fehler führte oder nur die Hälfte der Daten zurückgab, bevor die Verbindung vom Destruktor zwangsweise geschlossen wurde . Die Code-Optimierung des Release-Kandidaten muss bedeuten, dass das Glas entsorgt wurde, bevor der Reader fertig war.

es behoben, durch den

~SqlClass() 
    { 
     myConnection.Close(); // This was causing all the issues. 
    } 

Von der destructor Klasse zu entfernen, die das Problem behoben. Verlassen Sie sich jetzt nur auf den GC, um die SqlConnection-Klasse zu bereinigen.

+0

Ihr Code enthält nichts, was sich auf eine 'SqlClass' bezieht. – mjwills

+0

https://blogs.msdn.microsoft.com/b/cbrumme/archive/2004/02/20/77460.aspx kann eine Lektüre wert sein. "Eine der Richtlinien für die Fertigstellung ist, dass eine Finalize-Methode keine anderen Objekte berühren darf." – mjwills

Verwandte Themen