首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-01-25 
已有打开的与此命令相关联的 DataReader,必须首先将它关闭。求大神解决一下。已经用reader.Close()了。怎么还

已有打开的与此命令相关联的 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变量来复用数据逻辑连接的做法,就会在真正有并发操作时发生这类异常。

热点排行