C# Language 使用语句和数据库连接


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(如Entity Framework)公开了抽象类,这些抽象类用于以类似DbContext的类的形式与底层数据库交互。这些上下文通常也实现了IDisposable接口,并且应该尽可能通过using语句来利用这一点:

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