管理SQL Server连接

SQL连接的最佳实践是什么?

目前我使用以下内容:

using (SqlConnection sqlConn = new SqlConnection(CONNECTIONSTRING)) { sqlConn.Open(); // DB CODE GOES HERE } 

我已经读过这是一种非常有效的SQL连接方式。 默认情况下,SQL池是活动的,因此我理解的是,当using代码结束时, SqlConnection对象被关闭并处理,但是与DB的实际连接被放入SQL连接池中。 我错了吗?

这就是大部分。 需要考虑的其他一些要点:

  • 你在哪里得到你的连接字符串? 您不希望在整个地方进行硬编码,您可能需要保护它。
  • 在您真正使用连接( SqlCommandSqlParameterDataSetSqlDataAdapter )之前,您通常还要创建其他对象,并且您希望尽可能长时间地打开连接 。 完整模式需要考虑到这一点。
  • 您希望确保将数据库访问强制转换为自己的数据层类或程序集。 所以常见的做法是将其表达为私有函数调用:

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

请注意,我还能够“堆叠” cncmd对象的创建,从而减少嵌套并仅创建一个范围块。

最后,请注意在此特定示例中使用yield return代码。 如果您调用该方法并且不立即完成DataBinding或其他用途,则可能会长时间保持连接打开状态。 一个例子是使用它在ASP.NET页面的Load事件中设置数据源。 由于实际数据绑定事件直到稍后才会发生,因此您可以将连接打开的时间远远超过所需的时间。

Microsoft的模式和实践库是处理数据库连接的绝佳方法。 这些库封装了打开连接所涉及的大部分机制,这反过来又会让您的生活更轻松。

您对使用的理解是正确的,并且建议使用该方法。 您也可以在代码中调用close。

另外:开放晚,早关闭。

在调用数据库之前没有剩下的步骤之前,请不要打开连接。 完成后立即关闭连接。