2016-08-15 13 views
1

Ich versuche, eine SQL-Abfrage wie folgt auszuführen, aber Visual Studio beschwert sich eine CA2000.Wie behebt man dieses CA2000 für SqlCommand?

public static IDictionary<string, string> TemplateDirectories(string connectionString) { 
    var directories = new Dictionary<string, string>(); 
    using (var connection = new SqlConnection(connectionString)) { 
     connection.Open(); 
     using (var command = new SqlCommand { Connection = connection, CommandText = "select * from PATHS" }) { 
      var reader = command.ExecuteReader(); 
      while (reader.Read()) 
       directories[reader["CODE"].ToString()] = reader["PATH"].ToString(); 
       reader.Close(); 
     } 
    } 
    return directories; 
} 

Fehler CA2000 ... Objekt 'new SqlCommand()' wird nicht entlang aller Ausnahmepfade angeordnet sind. Rufen Sie System.IDisposable.Dispose für das Objekt 'new SqlCommand()' auf, bevor alle Verweise darauf außerhalb des Bereichs liegen.

Ich versuchte mehrere Möglichkeiten, um es zu beheben, aber niemand arbeitete. Also, wie zu reparieren?

+1

Versuchen Sie, Ihr Lesegerät in einer Anwendung zu verpacken? – garethb

+0

Hallo @garethb Ich versuchte 'using (var reader = command.ExecuteReader()) {...}', aber diese CA2000 beschwerte sich noch .. –

+1

Die Antworten sind richtig, dass es behoben werden kann, indem die Verwendung des Initialisierers - aber warum sind verwendest du einen trotzdem? Es gibt einen spezifischen Konstruktor für 'SqlCommand', der den Text des Befehls und ein SqlConnection-Objekt akzeptiert. –

Antwort

3

Dies ist wegen eines pitfall wenn Objektinitialisierer verwenden.

Der Weg SqlCommand wurde initialisiert, wenn beim Initialisieren des Objekts eine Ausnahme auftritt, wird SqlCommand nicht entsorgt.

Also was ist die Lösung. Erklären Sie das Objekt in altmodische Art und Weise, um loszuwerden, das Warnen

using (var command = new SqlCommand()) 
{ 
    command.Connection = connection; 
    command.CommandText="select * from PATHS"; 
    ... 
} 

ich einen sehr guten Artikel um diese gefunden, die mehr Details gibt und nähert sich dem Problem zu lösen - http://haacked.com/archive/2013/01/11/hidden-pitfalls-with-object-initializers.aspx/

Having said dass für dieses perticular Problem, wäre es besser, Konstruktor SqlCommand zu verwenden und den Befehlstext und Verbindungsobjekt wie dies passiert (courtesy: Damien_The_Unbeliever Kommentar)

string commandText = "select * from PATHS"; 
using (var command = new SqlCommand(commandText, connection)) 
{ 
    ... 
} 
3

Versuchen Sie, die command Parameter explizit zuordnen:

using (var command = new SqlCommand()) 
{ 
    command.Connection = connection; 
    command.CommandText="select * from PATHS"; 
    var reader = command.ExecuteReader(); 
    while (reader.Read()) 
     directories[reader["CODE"].ToString()] = reader["PATH"].ToString(); 
    reader.Close(); 
}