在 c# 中使用语句不会关闭连接。为什么?
Using statement in c# does not close the connection. Why?
我正在创建一个 crud gridview 网页,我在我的代码中使用 ASP.NET 中的 "using" 语句,因为我了解到它会自动转换其中的代码,所以我不会必须使用 connect.Close();
但是,我仍然收到错误消息:
System.InvalidOperationException: The connection was not closed. The connection's current state is open.
我试着输入 connection.Close();
但仍然出现同样的错误。
这是我的代码。谁能帮我解决这个问题?非常感谢
void PopulateGridView()
{
using (connect)
{
connect.Open();
adapter = new SqlDataAdapter("SELECT * FROM RetailInfo", connect);
table = new DataTable();
adapter.Fill(table);
}
if(table.Rows.Count > 0)
{
RetailInfoGridView.DataSource = table;
RetailInfoGridView.DataBind();
}
else
{
table.Rows.Add(table.NewRow());
RetailInfoGridView.DataSource = table;
RetailInfoGridView.DataBind();
RetailInfoGridView.Rows[0].Cells.Clear();
RetailInfoGridView.Rows[0].Cells.Add(new TableCell());
RetailInfoGridView.Rows[0].Cells[0].ColumnSpan = table.Columns.Count;
RetailInfoGridView.Rows[0].Cells[0].Text = "No record Found";
}
}
一个简单的修复在connect.Open()之前,您可以执行以下操作:
if (connect.State == ConnectionState.Open)
{
connect.Close();
}
此外,正如 Zohar Peled 指出的那样,使用 using (var connect = new SqlConnection(connectionString))
代替在 class 级别声明对象是很好的。
这样就没有泄漏,连接对象会在工作完成后立即处理。
替换这部分
using (connect)
{
connect.Open();
adapter = new SqlDataAdapter("SELECT * FROM RetailInfo", connect);
table = new DataTable();
adapter.Fill(table);
}
至
using (connect)
{
if (connect.State == ConnectionState.Open)
connect.Close();
connect.Open();
adapter = new SqlDataAdapter("SELECT * FROM RetailInfo", connect);
table = new DataTable();
adapter.Fill(table);
connect.Close();
}
我正在创建一个 crud gridview 网页,我在我的代码中使用 ASP.NET 中的 "using" 语句,因为我了解到它会自动转换其中的代码,所以我不会必须使用 connect.Close();
但是,我仍然收到错误消息:
System.InvalidOperationException: The connection was not closed. The connection's current state is open.
我试着输入 connection.Close();
但仍然出现同样的错误。
这是我的代码。谁能帮我解决这个问题?非常感谢
void PopulateGridView()
{
using (connect)
{
connect.Open();
adapter = new SqlDataAdapter("SELECT * FROM RetailInfo", connect);
table = new DataTable();
adapter.Fill(table);
}
if(table.Rows.Count > 0)
{
RetailInfoGridView.DataSource = table;
RetailInfoGridView.DataBind();
}
else
{
table.Rows.Add(table.NewRow());
RetailInfoGridView.DataSource = table;
RetailInfoGridView.DataBind();
RetailInfoGridView.Rows[0].Cells.Clear();
RetailInfoGridView.Rows[0].Cells.Add(new TableCell());
RetailInfoGridView.Rows[0].Cells[0].ColumnSpan = table.Columns.Count;
RetailInfoGridView.Rows[0].Cells[0].Text = "No record Found";
}
}
一个简单的修复在connect.Open()之前,您可以执行以下操作:
if (connect.State == ConnectionState.Open)
{
connect.Close();
}
此外,正如 Zohar Peled 指出的那样,使用 using (var connect = new SqlConnection(connectionString))
代替在 class 级别声明对象是很好的。
这样就没有泄漏,连接对象会在工作完成后立即处理。
替换这部分
using (connect)
{
connect.Open();
adapter = new SqlDataAdapter("SELECT * FROM RetailInfo", connect);
table = new DataTable();
adapter.Fill(table);
}
至
using (connect)
{
if (connect.State == ConnectionState.Open)
connect.Close();
connect.Open();
adapter = new SqlDataAdapter("SELECT * FROM RetailInfo", connect);
table = new DataTable();
adapter.Fill(table);
connect.Close();
}