已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
求大神解决一下。已经用reader.Close()了。怎么还错误!
public static tbBook GetBookById(string BId)
{
string sql = "select * from tb_Book where Bookid =@Bookid";
using (SqlDataReader reader = connDBHelper.GetReader(sql, new SqlParameter("@Bookid", BId)))
{
try
{
if (reader.Read())
{
tbBook book = new tbBook();
book.Bookid = (string)reader["Bookid"];
book.Bookname = (string)reader["Bookname"];
book.Bookclass = BookClassService.GetBookClassById((int)reader["Bookclass"]);
book.Author = (string)reader["author"];
book.Image = (string)reader["image"];
book.Publish = (string)reader["publish"];
book.Banci = (string)reader["banci"];
book.Price = (double)reader["price"];
book.Language = (string)reader["language"];
book.Page = (int)reader["page"];
book.Number = (int)reader["number"];
book.Kuc = (int)reader["kuc"];
book.Sales = (int)reader["sales"];
reader.Close();
return book;
}
else
{
reader.Close();
return null;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw e;
}
}
}
[解决办法]
用不着写什么 reader.Close()代码,当你的 using (SqlDataReader reader ......){ }代码块结束时,自动就会调用reader.Close()。你写了反而画蛇添足,多调用了一次。
实际上你的问题从你的描述中是看不出来的。我最晚回过一个帖子:
http://bbs.csdn.net/topics/390332308
你可以看到,每一次都要new一个新的数据库逻辑连接,这样系统才会去正确地从系统连接池中去复用数据库物理连接。
那种号称“为了提高效率”所以自己画蛇添足地弄个static变量来复用数据逻辑连接的做法,就会在真正有并发操作时发生这类异常。