SqlCommand正确关闭连接

时间:2015-06-11 09:49:25

标签: c# sql-server sqlconnection

我最近一直在做一个旧项目。我在项目中发现,以前的同事已经创建了一些用于打开数据库连接的常用方法。但是,一旦查询完成,我对它是否真正处理IDispose连接的过程存在疑问。

以下是方法:

连接数据库。

call function with (0,5,3)
call function with (2,5,3)
call function with (1,4,3)
call function with (1,6,3)
call function with (1,5,2)
call function with (1,5,4)
call function with (1,5,3)

然后我们使用GetDataReader,如下所示

/// <summary>
///     This method creates a connection object to the database.
/// </summary>
/// <returns>a new SQL Connection</returns>
public SqlConnection ConnectDB()
{
    var db = new SqlConnection(ConnectionString);
    db.Open();
    return db;
} 

public SqlDataReader GetDataReader(SqlCommand query)
{
    var db = ConnectDB();
    query.Connection = db;
    var reader = query.ExecuteReader();
    return reader;
}

您认为此过程会正确释放所有连接吗?

3 个答案:

答案 0 :(得分:2)

代码不安全。处置/关闭阅读器不会自动关闭连接,因为您可能希望在同一连接上执行多个命令。即使您使用 关闭连接的the override,在您输入using块之前可能发生的异常也会使连接保持打开状态。

典型的方法是在using语句中包装连接,命令和阅读器:

using(var con=new SqlConnection(connectionString))
using(var command=new SqlCommand(sql,con))
{
    con.Open();
    using(var reader=command.ExecuteReader())
    {
    ....
    }
}

答案 1 :(得分:1)

SqlConnection也实现了IDisposable接口,因此您也必须关闭连接。所以你也应该在using块中包装连接。

答案 2 :(得分:0)

不,您的代码没有正确释放所有连接,因为他们已在其他答案中确认。 虽然修改一个旧程序可能是一场噩梦我建议采用这样的方法

class Program
{
    static IEnumerable<SqlDataReader> InteractionGetData(string query)
    {
        using (var connection = new SqlConnection(@"Data Source=localhost;Integrated Security=SSPI;"))
        {
            connection.Open();

            using (var command = new SqlCommand(query, connection))
            {
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        yield return reader;
                    }
                }
            }
        }
    }

    static void Main(string[] args)
    {
        foreach (var reader in InteractionGetData("SELECT DISTINCT ProductName FROM Products"))
        {
            Console.WriteLine(reader.GetString(reader.GetOrdinal("ProductName")));
        }
    }
}