C# Language Verwenden von Anweisungen und Datenbankverbindungen


Beispiel

Das Schlüsselwort using stellt sicher, dass die in der Anweisung definierte Ressource nur im Geltungsbereich der Anweisung selbst vorhanden ist. Alle in der Anweisung definierten Ressourcen müssen die IDisposable Schnittstelle implementieren.

Diese sind beim Umgang mit Verbindungen, die die IDisposable Schnittstelle implementieren, IDisposable , da sie sicherstellen können, dass die Verbindungen nicht nur ordnungsgemäß geschlossen werden, sondern auch, dass ihre Ressourcen freigegeben werden, nachdem die using Anweisung außerhalb des Gültigkeitsbereichs liegt.

Häufige IDisposable

Viele der folgenden Klassen sind IDisposable Klassen, die die IDisposable Schnittstelle implementieren und IDisposable Kandidaten für eine using Anweisung sind:

  • SqlConnection , SqlCommand , SqlDataReader usw.
  • OleDbConnection , OleDbCommand , OleDbDataReader usw.
  • MySqlConnection , MySqlCommand , MySqlDbDataReader usw.
  • DbContext

Alle diese Optionen werden im Allgemeinen für den Zugriff auf Daten über C # verwendet. Sie werden häufig in gebäudedatenzentrierten Anwendungen angetroffen. Von vielen anderen Klassen, die nicht erwähnt werden und die dieselben Klassen FooConnection , FooCommand und FooDataReader FooCommand , kann erwartet werden, dass sie sich genauso verhalten.

Allgemeines Zugriffsmuster für ADO.NET-Verbindungen

Ein allgemeines Muster, das beim Zugriff auf Ihre Daten über eine ADO.NET-Verbindung verwendet werden kann, könnte wie folgt aussehen:

// This scopes the connection (your specific class may vary)
using(var connection = new SqlConnection("{your-connection-string}")
{
    // Build your query
    var query = "SELECT * FROM YourTable WHERE Property = @property");
    // Scope your command to execute
    using(var command = new SqlCommand(query, connection))
    {
         // Open your connection
         connection.Open();

         // Add your parameters here if necessary

         // Execute your query as a reader (again scoped with a using statement)
         using(var reader = command.ExecuteReader())
         {
               // Iterate through your results here
         }
    }
}

Oder wenn Sie nur ein einfaches Update durchführen und keinen Leser benötigen, würde dasselbe Grundkonzept gelten:

using(var connection = new SqlConnection("{your-connection-string}"))
{
     var query = "UPDATE YourTable SET Property = Value WHERE Foo = @foo";
     using(var command = new SqlCommand(query,connection))
     {
          connection.Open();
          
          // Add parameters here
          
          // Perform your update
          command.ExecuteNonQuery();
     }
}

Anweisungen mit DataContexts verwenden

Viele ORMs wie Entity Framework machen Abstraktionsklassen verfügbar, die zur Interaktion mit darunterliegenden Datenbanken in Form von Klassen wie DbContext . Diese Kontexte implementieren im Allgemeinen auch die IDisposable Schnittstelle und sollten dies durch die using Anweisungen nutzen, wenn möglich:

using(var context = new YourDbContext())
{
      // Access your context and perform your query
      var data = context.Widgets.ToList();
}