已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

long147617895 2012-12-29 02:00:07
求大神解决一下。已经用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;

}

}

}
...全文
117 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
long147617895 2012-12-29
  • 打赏
  • 举报
回复
我的业务逻辑层的代码,要怎么更改呢?郁闷了一天了,求助一下。 namespace OnLineBLL { public class BookManager { //添加信息 public static void AddBook(tbBook book) { BookService.AddBook(book); } //获取所有信息 public static IList<tbBook> GetAllBook() { return BookService.GetAllBook(); } //根据ID获取信息 public static tbBook GetBookById(string BId) { return BookService.GetBookById(BId); } } }
long147617895 2012-12-29
  • 打赏
  • 举报
回复
我是做一个图书管理系统,调试的时候没有出错,添加操作的时候出错了。
long147617895 2012-12-29
  • 打赏
  • 举报
回复
在网上搜索了一下,才用上using关键字的。发现怎么弄都不行。
wm0508 2012-12-29
  • 打赏
  • 举报
回复
1、一个SqlConnection只能对应一个SqlDataReader,用完就关闭连接;之后如果需要用到SqlDataReader需要重新连接 2、建议你使用SqlDataAdapter和DataSet来做
  • 打赏
  • 举报
回复
你的代码,跟 reader.Close() 没有关系。而是你隐藏起来的、有关new一个新的数据逻辑连接的代码,有问题。
  • 打赏
  • 举报
回复
用不着写什么 reader.Close()代码,当你的 using (SqlDataReader reader ......){ }代码块结束时,自动就会调用reader.Close()。你写了反而画蛇添足,多调用了一次。 实际上你的问题从你的描述中是看不出来的。我最晚回过一个帖子:
http://bbs.csdn.net/topics/390332308
你可以看到,每一次都要new一个新的数据库逻辑连接,这样系统才会去正确地从系统连接池中去复用数据库物理连接。 那种号称“为了提高效率”所以自己画蛇添足地弄个static变量来复用数据逻辑连接的做法,就会在真正有并发操作时发生这类异常。
hard_learner 2012-12-29
  • 打赏
  • 举报
回复
跟踪一下哪行代码出的异常

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧