0

今天我注意到一段代码,如下所示:

public class Test
{
    SqlConnection connection1 = 
      new SqlConnection(ConfigurationManager.ConnectionStrings["c1"].ToString());
    SqlConnection connection2 = 
      new SqlConnection(ConfigurationManager.ConnectionStrings["c2"].ToString());

    public void Method1()
    {
        using (connection1)
        {
            connection1.Open();
            using (SqlCommand newSqlCommand = new SqlCommand("text",connection2))
            {
            // do something       
            }         
        }
    }

    public void Method2()
    {
        using (connection1)
        {
            // do something                
        }
    }
}

我只是想知道为什么有人想在创建类而不是在类中调用相应方法时打开连接?

编辑:我应该可能已经发布了整个代码。所以我确实看到他们在哪里打开 connection1,但随后他们正在使用不同的 sql 连接(connection2)实例化一个 sqlcommand,该连接尚未在任何地方打开。我在这里想念什么?

谢谢,

4

4 回答 4

1

此行仅初始化一个连接对象,该对象稍后可用于打开与数据库服务器的连接。

SqlConnection connection1 = 
new SqlConnection(ConfigurationManager.ConnectionStrings["c1"].ToString());

我所知道的是,在其作用域之后使用对象的处置(在连接对象的情况下,它们会自动关闭),所以我不推荐这种用法,因为它可能与其他对象类型(除了连接)有问题,可以'在他们的 dispose 被调用后不被使用。

于 2012-10-06T01:59:14.607 回答
0

connection1 = new SqlConnection(...)并没有真正打开连接。它只是创建连接对象。

你必须打电话connection1.Open();才能真正打开它。您可以在using语句块中执行此操作。

有关更多详细信息,请参阅此MSDN页面。

于 2012-10-06T01:47:36.597 回答
0

代码很危险。如果您调用 Method1 然后 Method2(反之亦然),您将收到错误消息(连接字符串未初始化)。发生错误是因为该using语句将关闭连接并释放对象。我仔细检查了调用 dispose 时会发生什么......连接字符串被清除(可能还有一些我没有注意到的其他事情)。

您不想重复使用已处置的对象。

实例化一个新的连接对象的成本是微不足道的,所以我只需要在需要的地方创建对象,也许用一点工厂方法来减少代码重复,所以改为:-

    private static SqlConnection GetSqlConnection()
    {
        return new SqlConnection(ConfigurationManager.ConnectionStrings["c1"].ToString());
    }

    private void Method1()
    {
        using (var conn = GetSqlConnection())
        {
            conn.Open();
            // do stuff...
        }
    }
    private void Method2()
    {
        using (var conn = GetSqlConnection())
        {
            conn.Open();
            // do other stuff...
        }
    }

当然,有许多不同的方法可以解决这个问题,这只是一种而且确实非常简单的方法......但这是一个很好的起点并且是安全的 :-)

于 2012-10-06T04:39:05.330 回答
0

它要么

  • 以这种方式编写以强制在类上只执行对方法的单个调用
  • 如果您调用 2 个方法,则会因抛出 ObjectDisposed 异常而无意中造成混淆
  • 在您省略的块中包含连接重新初始化代码。
于 2012-10-06T01:58:57.753 回答