var filterConditions = new[] {
CreateSqlFilter("CIVILIDD", ID_No, selectCommand, false),
};
string filterCondition = filterConditions.Any(a => a != null) ? filterConditions.Where(a => a != null).Aggregate((filter1, filter2) => String.Format("{0} AND {1}", filter1, filter2)) : (string)null;
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["my"].ConnectionString))
{
selectCommand.Connection = connection;
selectCommand.CommandText = filterCondition == null ? "SELECT * FROM _4" : "SELECT * FROM _4 WHERE " + filterCondition;
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
DataTable dataSource = new DataTable();
adapter.Fill(dataSource);
dataGridView2.DataSource = dataSource;
using (SqlCommand command2 = new SqlCommand("SELECT * FROM [_4] WHERE CIVILIDD = @id", mycon))
{
command2.Parameters.AddWithValue("@id", ID_No.Text);
SqlDataReader dr = command2.ExecuteReader();
while (dr.Read())
{
txtname1.Text = (dr["name1"].ToString());
txtname2.Text = (dr["name2"].ToString());
Governorate.Text = (dr["Governorate"].ToString());
City.Text = (dr["City"].ToString());
Block.Text = (dr["Block"].ToString());
Street.Text = (dr["Street"].ToString());
Avenue.Text = (dr["Avenue"].ToString());
House.Text = (dr["House"].ToString());
Floor.Text = (dr["Floor"].ToString());
flat.Text = (dr["flat"].ToString());
}
}
}
我使用此代码过滤数据库,并且在第一次运行它时收到该错误,第二次运行时我会收到该错误
System.InvalidOperationException:'已经存在与此Command关联的打开的DataReader,必须先关闭它。'
在此行中SqlDataReader dr = command2.ExecuteReader();
答案 0 :(得分:3)
使用后,您需要关闭数据读取。
这是您不使用Using()
时的代码外观
通过评论了解
var filterConditions = new[] {
CreateSqlFilter("CIVILIDD", ID_No, selectCommand, false),
};
string filterCondition = filterConditions.Any(a => a != null) ? filterConditions.Where(a => a != null).Aggregate((filter1, filter2) => String.Format("{0} AND {1}", filter1, filter2)) : (string)null;
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["my"].ConnectionString))
{
selectCommand.Connection = connection;
selectCommand.CommandText = filterCondition == null ? "SELECT * FROM _4" : "SELECT * FROM _4 WHERE " + filterCondition;
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
DataTable dataSource = new DataTable();
adapter.Fill(dataSource);
dataGridView2.DataSource = dataSource;
using (SqlCommand command2 = new SqlCommand("SELECT * FROM [_4] WHERE CIVILIDD = @id", mycon))
{
command2.Parameters.AddWithValue("@id", ID_No.Text);
SqlDataReader dr = command2.ExecuteReader();
while (dr.Read())
{
txtname1.Text = (dr["name1"].ToString());
txtname2.Text = (dr["name2"].ToString());
Governorate.Text = (dr["Governorate"].ToString());
City.Text = (dr["City"].ToString());
Block.Text = (dr["Block"].ToString());
Street.Text = (dr["Street"].ToString());
Avenue.Text = (dr["Avenue"].ToString());
House.Text = (dr["House"].ToString());
Floor.Text = (dr["Floor"].ToString());
flat.Text = (dr["flat"].ToString());
}
// Close and Dispose the datareader
dr.Close();
dr.Dispose();
}
}
答案 1 :(得分:0)
您必须处置适配器创建的第一个数据读取器。 using语句将负责处理开箱即用的资源。
您只能将数据读取器与一个命令关联使用(就像错误状态一样)。创建2个using语句并准备2个数据读取器。这可以与using(connection)相同,因为一个连接可以用于多个命令,但是每个命令必须具有单独的数据读取器。
using (SqlDataAdapter a = new SqlDataAdapter("SELECT * FROM EmployeeIDs", c))
{
}
using( ..command2.. )
{
SqlDataReader dr = command2.ExecuteReader();
}
了解有关HERE的更多信息