c# - 使用属性时连接状态关闭

标签 c# asp.net properties sqlconnection

我正在尝试将 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/

相关文章:

c# - 如何实现 DateTime 实体属性以始终设置 DateTime.Now

c# - 如果我的程序正在将 dll 文件复制到临时目录,我是否需要特定权限?

c# - 当用户没有将完整的 json 传递给 .NET Web API 时怎么办?

c# - Nhibernate 的所有删除孤儿

asp.net - Log4Net 在本地工作,但不在远程 Azure DB 上工作

javascript - ASP.NET 在执行代码隐藏之前确认

c# - 如何通过自定义控件在母版页上设置属性?

c# - 如果 c# 中的值为 null,则为对象分配默认值

iphone - 与 Objective-C 中的头文件和实现文件混淆

java - 将 java bean 属性名称存储为常量并检查它们的一致性