已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
SqlConnection connq = myconnection();
SqlCommand cmd = new SqlCommand();
cmd.Connection = connq;
connq.Open();
cmd.CommandText = "select 数量 from CaiDan where 订单单号='" + bianhao + "'";
SqlDataReader dr_1 = cmd.ExecuteReader();
while (dr_1.Read())
{
shuL += int.Parse(dr_1[0].ToString());
}
dr_1.Close();
cmd.CommandText = "select * from CaiDan where 订单单号='" + bianhao + "'";
SqlDataReader dr_2 = cmd.ExecuteReader();
if (dr_2.Read())
{
cmd.CommandText = "delete CaiDan where 订单单号='" + bianhao + "'";
cmd.ExecuteNonQuery();//这句话有错误,提示:已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
}
怎么解决,谢谢! 展开
主要原因是 DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。
1、首先输入代码:
private static string strConn = ConfigurationManager.ConnectionStrings["SQLLSB2008"].ConnectionString;
private static SqlConnection myConn = null;
private static SqlDataAdapter myAdapter = new SqlDataAdapter();
private static SqlCommand myCmd = new SqlCommand();
private static DataTable myTable = new DataTable();
2、然后输入下方的代码:
public static DataTable returnDataTable(string mySql, SqlParameter[] parameters)
{
myConn = new SqlConnection(strConn);
using (myCmd = new SqlCommand(mySql, myConn))
{
try
{
myCmd.Parameters.AddRange(parameters);
myAdapter = new SqlDataAdapter(myCmd);
myTable.Clear();
myAdapter.Fill(myTable);
}
3、然后输入下方的代码,就可以解决问题了:
catch
{
connClose();
}
finally
{
connClose();
}
}
return myTable;
}
2024-11-19 广告
DataReader 在打开使用时,一个 SqlConnection 只允许打开一个 DataReader,在开启另一个 DataReader 时,必须将前面一个先 Close 掉。
1、使用数据库更新或插入语句时,通常用 SqlCommand 的 ExecuteNonQuery() 方法,并且定义了一个公共的数据库连接,每次查询时都生成新连接不会有这个问题,但会占用高的数据库资源。
2、这种情况下,内部会生成一个空的 DataReader 对象,当前的数据库连接关闭掉后,该 DataReader 才会释放,因此在推荐使用 using 关键字,可以将它所定义范围内的对象都释放掉。
3、也可以设定ConnectionString,直接加上MultipleActiveResultSets=true语句,只适用于SQL 2005之后的版本,先读出放置在List中。
4、改为下图代码之后,ToList之后就被读到内存中了,与DataContext脱钩了。
解决方法如下:
1、reader跟cmOrder两个对象不要共用一个Connection对象。
2、不要在while代码段内执行reader.Close();语句。否则继续执行while代码段内语句会报“阅读器关闭时尝试调用 Read 无效。”错误提示。