我正在尝试将 Using()
语句与 SqlConnection
一起使用。
我已将 SqlConnection
设为页面属性,如下所示...
public SqlConnection baseConnection
{
get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}
然后像这样创建了 using()
语句...
using (baseConnection)
{
SqlCommand select = new SqlCommand("SELECT * FROM TABLE", baseConnection);
baseConnection.Open();
SqlDataReader reader = select.ExecuteReader();
//... other irrelevant code
}
但是当代码运行时我得到一个异常
Exception Details: System.InvalidOperationException: ExecuteReader requires an open and available Connection. The connection's current state is closed
我理解异常,但我不明白的是,为什么当我用 baseConnection.Open()
打开连接时连接没有打开?
我在整个站点都使用此连接,我想将它作为页面属性放在自定义基类中,这样我就不必继续输入它了。这是不允许的吗?
最佳答案
我在你的例子中发现的问题
You get new SqlConnection object each time you request baseConnection property
有问题的代码:
public SqlConnection baseConnection
{
get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}
更正代码
private SqlConnection _baseConnection;
public SqlConnection BaseConnection
{
get { return _baseConnection = _baseConnection ?? new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}
此处 返回 _baseConnection = _baseConnection ?? new SqlConnection()
使用 C# ??
中的 Null Coaleasing 运算符,即如果 _baseConnection
变量为空,它将创建新实例。
我的假设
BaseConnection
属性在某些 BaseClass
中定义,并且派生类不会在子派生类中进一步扩展。通过这种方式,每个派生类类型都会使用一个 SqlConnection。
关于c# - 使用属性时连接状态关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15520466/