使用語句和資料庫連線
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();
}