使用語句和資料庫連線

using 關鍵字確保語句中定義的資源僅存在於語句本身的範圍內。宣告中定義的任何資源都必須實現 IDisposable 介面。

在處理實現 IDisposable 介面的任何連線時,這些都非常重要,因為它可以確保連線不僅正確關閉,而且在 using 語句超出範圍後釋放其資源。

常見的 IDisposable 資料類

以下許多是與資料相關的類,它們實現了 IDisposable 介面,是 using 語句的完美候選:

  • SqlConnectionSqlCommandSqlDataReader
  • OleDbConnectionOleDbCommandOleDbDataReader
  • MySqlConnectionMySqlCommandMySqlDbDataReader
  • DbContext

所有這些通常用於通過 C#訪問資料,並且在構建以資料為中心的應用程式中通常會遇到這些資料。許多其他未提及實現相同的 FooConnectionFooCommandFooDataReader 類的類可以表現出相同的行為。

ADO.NET 連線的通用訪問模式

通過 ADO.NET 連線訪問資料時可以使用的常見模式可能如下所示:

// 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
         }
    }
}

或者,如果你只是執行簡單更新而不需要閱讀器,則適用相同的基本概念:

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();
     }
}

使用帶有 DataContexts 的語句

許多 ORM(如實體框架)公開了抽象類,這些抽象類用於以 DbContext 等類的形式與底層資料庫進行互動。這些上下文通常也實現了 IDisposable 介面,並且應儘可能通過 using 語句利用這一點:

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