今天我注意到一段代码如下所示:
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的位置,但是他们正在实例化一个sqlcommand,它有一个不同的sql连接(connection2),它没有在任何地方打开。我在这里缺少什么?
谢谢,
答案 0 :(得分:1)
此行仅初始化连接对象,该对象稍后可用于打开与数据库服务器的连接。
SqlConnection connection1 =
new SqlConnection(ConfigurationManager.ConnectionStrings["c1"].ToString());
我所知道的是,在其范围之后使用处理对象(以及在Connection对象的情况下它们会自动关闭),所以我不推荐这样的用法,因为它可能对其他对象类型有问题(除了Connection之外) )在被处置后不能使用。
答案 1 :(得分:0)
connection1 = new SqlConnection(...)
并未真正打开连接。它只是创建连接对象。
您必须致电connection1.Open();
才能实际打开它。您可以在using
语句块中执行此操作。
有关详细信息,请参阅此MSDN页面。
答案 2 :(得分:0)
它要么
答案 3 :(得分: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...
}
}
当然有很多不同的方法来解决这个问题,这只是一个而且确实相当简单......但这是一个很好的起点并且是安全的: - )