使用属性时关闭连接状态

Stu*_*art 1 c# asp.net sqlconnection properties

我正试图用一个Using()声明SqlConnection.

我已经制作了这样SqlConnection的页面属性......

public SqlConnection baseConnection
{
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}
Run Code Online (Sandbox Code Playgroud)

然后创建了using()这样的声明......

using (baseConnection)
            {
                SqlCommand select = new SqlCommand("SELECT * FROM TABLE", baseConnection);
                baseConnection.Open();
                SqlDataReader reader = select.ExecuteReader();

                //... other irrelevant code
            }
Run Code Online (Sandbox Code Playgroud)

但是当代码运行时,我得到一个例外

异常详细信息:System.InvalidOperationException:ExecuteReader需要打开且可用的连接.连接的当前状态已关闭

我理解异常,我不明白,为什么我打开它时连接没有打开baseConnection.Open()

我在整个站点使用此连接,并且我想将它作为页面属性放在自定义基类中,因此我不必继续键入它.这是不允许的?

Har*_*aid 6

我在你的例子中找到的问题

每次请求baseConnection属性时,都会获得新的SqlConnection对象

有问题的代码:

public SqlConnection baseConnection
{
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}
Run Code Online (Sandbox Code Playgroud)

更正代码

private SqlConnection _baseConnection;
public SqlConnection BaseConnection
{
    get { return _baseConnection = _baseConnection ?? new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}
Run Code Online (Sandbox Code Playgroud)

这里return _baseConnection = _baseConnection ?? new SqlConnection()使用来自C#的Null Coaleasing运算符,??即如果_baseConnection变量为null ,它将创建新实例.

My Assumptions
BaseConnection属性在某些中定义,BaseClass派生类在子派生类中不会进一步扩展.这样,每个派生类类型都会使用一个SqlConnection.