C#sql为每个查询创建一个连接并打开和关闭

时间:2015-07-08 19:11:16

标签: c# sql sql-server

我最近继承了一个C#Web应用程序,为每个查询创建一个新连接,如下所示:

public class QueryForm
{
    public bool getStudents()
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
        conn.Open();
        //commands
        conn.Close();
    }

    protected void getProfessors()
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
        conn.Open();
        //Commands
        conn.Close();
    }


    protected void getProfessors()
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
        conn.Open();
        //Commands
        conn.Close();
    }
}

我知道这通常是最好的方法,但是让构造函数创建连接对象是可接受的或“最佳实践”,然后打开每个方法/ Query然后关闭该连接:

public class QueryForm
{
    SqlConnection conn;

    public QueryForm()
    {
        conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
    }

    public bool getStudents()
    {
        conn.Open();
        //commands
        conn.Close();
    }

    protected void getProfessors()
    {
        conn.Open();
        //Commands
        conn.Close();
    }

    protected void getCourses()
    {
        conn.Open();
        //Commands
        conn.Close();
    }
}

我更喜欢第二种方式,因为它不会产生多个连接对象。但是,如果我要使方法和类静态,第一种方式也会更好。

2 个答案:

答案 0 :(得分:11)

其中任何一个都是可以接受的。 SqlConnection使用连接池,因此它不应该影响性能。拥有多个SqlConnection对象不会伤害任何东西。这归结为偏好。

如果你在方法中保持连接,我建议将命令封装在using语句中,例如:

using (SqlConnection conn = new SqlConnection(...))
{
    conn.Open();
    //commands
    conn.Close();
}

这可确保正确处理连接。

答案 1 :(得分:2)

最短时间内保持连接打开非常重要。 SQL连接使用connection pool,因此打开连接实际上会重用幕后连接。 如果您保持连接打开,则可能会遇到错误:如果您使用BeginTransaction方法,则“不支持并行事务”。

这是一个可能有大量连接的网络应用, 将连接对象保持打开状态会使您面临耗尽连接池的风险,并且:“在从池中获取连接之前已经过了超时时间”错误。

此外,即使抛出异常,也必须确保连接已关闭。

这应该使用如下的使用块来完成:

using (SqlConnection conn = new SqlConnection(...))
{
    conn.Open();
    //commands
}

因为退出'using'块会对使用过的对象调用.Dispose()。

或使用try / catch / finally块,如:

SqlConnection conn = null;

try
{
    conn = new SqlConnection(...);    
    conn.Open();
    //commands
}
catch(Exception ex)
{
    ...
}
finally
{
    if(conn != null)
        conn.Close();
}