嵌套“使用”语句的正确格式?

时间:2012-04-26 22:47:22

标签: c# ado.net

我有以下一组代码:

using (OracleConnection conn = new OracleConnection(m_fceConn))
{
    conn.Open();

    using (OracleCommand cmd = new OracleCommand(m_sql, conn))
    {
        using (OracleDataReader reader = cmd.ExecuteReader())
        {
            reader.Read();
        }
    }

    conn.Close();
}

有没有更好的格式化方法?当然,稍后我可能会打破连接,运行查询,并在以后将连接关闭到单独的函数中,但是这种嵌套仍然会在“幕后”可以说。

我在另一个帖子上读到我可以格式化这样的事情:

using (OracleConnection conn = new OracleConnection(m_fceConn))
using (OracleCommand cmd = new OracleCommand(m_sql, conn))

但考虑到我在每个陈述之间都有代码,我不相信我可以省略这样的括号。我只是在寻找最好/最安全的做法,因为我仍然是C#的新手/菜鸟。感谢。

4 个答案:

答案 0 :(得分:3)

我可能错了,但我认为在将连接传递给OracleCommand之前不需要打开连接。您只需在执行命令之前打开它。所以你可以把上面的内容写成:

using (OracleConnection conn = new OracleConnection(m_fceConn)) 
using (OracleCommand cmd = new OracleCommand(m_sql, conn))
{ 
    conn.Open(); 
    using (OracleDataReader reader = cmd.ExecuteReader()) 
    { 
        reader.Read(); 
    } 
}

(你也不需要显式关闭,因为处理连接应该自动关闭它。)

上面的代码没什么特别的(除了它看起来不错),它只是使用普通的C#规则将单个命令应用于这些块。它与此相同:

if (...)
if (...)
   dosomething(); // Look Ma, no curly braces

只是你正在“堆叠”多个单一陈述。

答案 1 :(得分:2)

您所拥有的内容格式正确,但没有必要调用conn.Close(),因为连接将在声明它的using块的末尾处理(并因此关闭)。

但是,您可以省略第二个语句的括号,因为该语句的整体只是另一个using块。

答案 2 :(得分:2)

您的第一个使用声明需要括号,因为您在那里有conn.Open()电话。第二个和第三个可以按照你的说法堆叠,这是非常惯用的C#(在我的例子中是首选)。

答案 3 :(得分:0)

using (OracleConnection conn = new OracleConnection(m_fceConn))
{
    conn.Open();

    using (OracleDataReader reader = new OracleCommand(m_sql, conn).ExecuteReader())
    {
        reader.Read();
    }

    conn.Close();
}

修改 再想一想,不要这样做。它不会丢弃命令对象。我将在这里留下答案,作为不做的事情的一个例子。