7

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

目前我正在使用以下内容:

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

我读过这是一种非常有效的 SQL 连接方式。默认情况下,SQL 池是活动的,所以我的理解是,当using代码结束时,SqlConnection对象被关闭并释放,但与数据库的实际连接放在 SQL 连接池中。我错了吗?

4

4 回答 4

14

这是大部分。需要考虑的一些额外要点:

  • 你从哪里得到你的连接字符串?您不希望到处都是硬编码,您可能需要保护它。
  • 在真正使用连接之前,您通常还需要创建其他对象(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<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;
            }
        }
    }
}

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

最后,请注意使用yield return此特定示例中的代码。如果您调用该方法并且没有DataBinding立即完成您的或其他用途,它可能会长时间保持连接打开。这方面的一个示例是在LoadASP.NET 页面的事件中使用它来设置数据源。由于实际的数据绑定事件要到稍后才会发生,因此您可以使连接保持打开的时间比需要的时间长得多。

于 2009-05-26T17:27:43.760 回答
2

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

于 2009-05-26T18:06:38.890 回答
1

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

于 2009-05-26T17:20:26.393 回答
0

还有:开晚了,早关了。

在调用数据库之前没有其他步骤之前不要打开连接。完成后立即关闭连接。

于 2009-05-26T18:08:09.637 回答