我可以通过SqlCommand.Disposed事件处理SqlConnection吗?

时间:2010-11-08 00:18:38

标签: c# .net

我可以将事件附加到将处理SqlCommand连接的SqlCommand.Disposed事件吗?这是我正在测试的代码:

    public static SqlCommand GetCommand(string query, SqlParameter[] paramCollection, bool isStoredProcedure)
    {
        return new DBSettings().CreateCommand(query, paramCollection, isStoredProcedure);
    }

    public SqlCommand CreateCommand(string query, SqlParameter[] paramCollection, bool isStoredProcedure)
    {
        SqlConnection conn = new SqlConnection(connString);
        conn.Open();
        SqlCommand cmd = new SqlCommand(query, conn);
        if (paramCollection.Length > 0)
            cmd.Parameters.AddRange(paramCollection);
        if (isStoredProcedure)
            cmd.CommandType = CommandType.StoredProcedure;
        cmd.Disposed += new EventHandler(cmd_Disposed);
        return cmd;
    }

    protected void cmd_Disposed(object sender, EventArgs e)
    {
        SqlCommand cmd = (SqlCommand)sender;
        cmd.Connection.Dispose();
    }

我希望能够在一个using块中调用静态方法GetCommand,当它完成后,处理这样的连接:

        using (SqlCommand cmd = GetCommand(query, paramCollection, false))
        {
            //code to execute
        }

2 个答案:

答案 0 :(得分:2)

你的方法应该有用,但它确实是违反直觉的,我建议重新考虑一下这个设计。依赖对象(命令)控制它所依赖的对象(连接)的生命周期?如果要在同一连接上运行更多命令,该怎么办?交易怎么样?

答案 1 :(得分:1)

您的代码应该可以正常工作 您可以通过在Disposed处理程序中设置断点来测试它。

您还可以使用匿名方法缩短它:

cmd.Disposed += delegate { conn.Dispose(); };