使用属性时连接状态关闭

本文关键字:状态 连接 属性 | 更新日期: 2023-09-27 18:05:06

我正在尝试使用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需要一个打开的可用连接。连接的当前状态为关闭

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

我在整个网站上都使用这个连接,我想把它放在一个自定义基类中作为页面属性,这样我就不必一直输入它了。这是不允许的吗?

使用属性时连接状态关闭

我在你的例子中发现的问题

每次请求baseConnection property

都会得到新的SqlConnection对象

问题代码:

public SqlConnection baseConnection
{
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}
<<p> 纠正代码/strong>
private SqlConnection _baseConnection;
public SqlConnection BaseConnection
{
    get { return _baseConnection = _baseConnection ?? new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}

这里return _baseConnection = _baseConnection ?? new SqlConnection()使用了c# ??的空合并运算符,即如果_baseConnection变量为空,它将创建新的实例。

<<p> 我的假设/strong>
BaseConnection属性是在某些BaseClass中定义的,派生类在子派生类中没有进一步扩展。这样,每个派生类类型都有一个正在使用的SqlConnection。

你的代码应该是:

using (var myConnection = baseConnection)
            {
                SqlCommand select = new SqlCommand("SELECT * FROM TABLE", myConnection );
                myConnection .Open();
                SqlDataReader reader = select.ExecuteReader();
                //... other irrelevant code
            }
   string sQry = "Select * from TestEmp"; // Select Table
   SqlCommand cmd = new SqlCommand(sQry, conDB);// Pass Sql Query & Sql Connection in Sql Command
   conDB.Open();// Open DB
   SqlDataAdapter objAdapter = new SqlDataAdapter(cmd); // Create DisConnected Architecture
   DataTable objTable = new DataTable(); // Create Data Table
   objAdapter.Fill(objTable);// Fill Data Table using Adapter Object
   dgvDisplay.DataSource = objTable; // Display select result in DataGridView Box
   conDB.Close(); // Close Connection