使用属性时连接状态关闭
本文关键字:状态 连接 属性 | 更新日期: 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
变量为空,它将创建新的实例。
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