使用语句和数据库连接

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