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# 的新手/菜鸟。谢谢。

4

4 回答 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

只是您正在“堆叠”多个单个语句。

于 2012-04-26T22:58:10.033 回答
2

您所拥有的格式正确,尽管没有必要调用conn.Close(),因为连接将在using声明它的块的末尾被释放(并因此关闭)。

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

于 2012-04-26T22:51:07.363 回答
2

你的第一个 using 语句需要有括号,因为你在conn.Open()那里有调用。如您所说,第二个和第三个可以堆叠,这是非常惯用的 C#(在我的情况下是首选)。

于 2012-04-26T22:51:19.623 回答
0
using (OracleConnection conn = new OracleConnection(m_fceConn))
{
    conn.Open();

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

    conn.Close();
}

编辑再三 考虑,不要这样做。它不会处理命令对象。我将把答案留在这里作为不应该做的一个例子。

于 2012-04-26T22:52:15.367 回答