嵌套的 "using" 语句的正确格式是什么?

4
我有以下代码集合:
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#还相对新手/初学者。谢谢。


你不需要关闭连接,因为dispose(using)隐式调用close。 - Tim Schmelter
@Tim Schmelter:谢谢你提供的这个小建议。我确信它可以正常运行,但我认为还是安全第一比较好。不过,我也很喜欢显式地写出Open-> Read <-Close,因为再清晰不过了。是否有可能存在任何问题,如果我不这样做? - Kittoes0124
@Kittoes - 没有问题。您还可以执行 cmd.ExecuteReader(CommandBehavior.CloseConnection),它也会关闭连接。 - Erik Funkenbusch
@Mystere Man:我很好奇,这样做有什么优势吗?还是说这只是关闭连接的另一个选项? - Kittoes0124
@Kittoes - 另一种方式而已。在某些情况下可能会有优势,但我想不出具体是什么了。 - Erik Funkenbusch
4个回答

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

这只是你在"堆叠"多个单个语句。


2
你所拥有的格式正确,但是不必调用conn.Close(),因为连接将在声明它的using块结束时被处理(并因此关闭)。
然而,你可以省略第二个语句的括号,因为该语句的全部内容只是另一个using块。

2

你的第一个using语句需要加上括号,因为你在那里调用了conn.Open()。第二个和第三个可以像你说的那样堆叠,这在C#中是相当惯用的(也是我喜欢的方式)。


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

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

    conn.Close();
}

编辑 再想一想,不要这样做。这样做不会处理命令对象。我将保留答案作为不应该做的示例。


1
这并不会处理该命令,除非 Oracle 库中的其他技巧进行了处理。 - Adam Robinson
您可以随时编辑或删除您的答案,如果它不再相关。 - Adam Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接