这是大部分。需要考虑的一些额外要点:
- 你从哪里得到你的连接字符串?您不希望到处都是硬编码,您可能需要保护它。
- 在真正使用连接之前,您通常还需要创建其他对象(
SqlCommand
、SqlParameter
、DataSet
、SqlDataAdapter
),并且您希望尽可能长时间地等待打开连接。完整的模式需要考虑到这一点。
- 您想确保您的数据库访问被强制进入它自己的数据层类或程序集。所以一个常见的做法是将其表达为私有函数调用:
.
private static string connectionString = "load from encrypted config file";
private SqlConnection getConnection()
{
return new SqlConnection(connectionString);
}
然后像这样编写您的示例:
using (SqlConnection sqlConn = getConnection())
{
// create command and add parameters
// open the connection
sqlConn.Open();
// run the command
}
该示例只能存在于您的数据访问类中。另一种方法是对其进行标记并将internal
数据层分布在整个程序集中。主要的是严格执行数据库代码的干净分离。
真正的实现可能如下所示:
public IEnumerable<IDataRecord> GetSomeData(string filter)
{
string sql = "SELECT * FROM [SomeTable] WHERE [SomeColumn] LIKE @Filter + '%'";
using (SqlConnection cn = getConnection())
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;
cn.Open();
using (IDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
yield return (IDataRecord)rdr;
}
}
}
}
请注意,我还能够“堆叠”cn
和cmd
对象的创建,从而减少嵌套并仅创建一个范围块。
最后,请注意使用yield return
此特定示例中的代码。如果您调用该方法并且没有DataBinding
立即完成您的或其他用途,它可能会长时间保持连接打开。这方面的一个示例是在Load
ASP.NET 页面的事件中使用它来设置数据源。由于实际的数据绑定事件要到稍后才会发生,因此您可以使连接保持打开的时间比需要的时间长得多。