使用语句和数据库连接
using
关键字确保语句中定义的资源仅存在于语句本身的范围内。声明中定义的任何资源都必须实现 IDisposable
接口。
在处理实现 IDisposable
接口的任何连接时,这些都非常重要,因为它可以确保连接不仅正确关闭,而且在 using
语句超出范围后释放其资源。
常见的 IDisposable
数据类
以下许多是与数据相关的类,它们实现了 IDisposable
接口,是 using
语句的完美候选:
SqlConnection
,SqlCommand
,SqlDataReader
等OleDbConnection
,OleDbCommand
,OleDbDataReader
等MySqlConnection
,MySqlCommand
,MySqlDbDataReader
等DbContext
所有这些通常用于通过 C#访问数据,并且在构建以数据为中心的应用程序中通常会遇到这些数据。许多其他未提及实现相同的 FooConnection
,FooCommand
,FooDataReader
类的类可以表现出相同的行为。
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();
}