日期:2014-05-19  浏览次数:20445 次

帮忙调试以下的代码?为何出错。
SqlDataReader   recu   =   DBOP.GetDataReader( "Select   *   from   UserS   where   UserID= ' "   +   TextBox1.Text.ToString()   +   " '   and   Password= ' "   +  
                        TextBox2.Text.ToString()   +   " ' ");
if   (recu.Read())   //这句提示报错。(阅读器关闭时Read的尝试无效)
{
    userId   =   recu[ "UserID "].ToString();    
  }
recu.Close();
//DBOP.GetDataReader   是写的一个共用类中方法,返回一个SqlDataReader   。代码如下
  public   SqlDataReader   GetDataReader(string   selectSql)
                {
                        SqlDataReader   RetDataReader;
                        SqlConnection   Conn   =   new   SqlConnection(connString);
                        try
                        {
                                Conn.Open();
                                SqlCommand   Cmd   =   new   SqlCommand(selectSql,   Conn);
                                RetDataReader   =   Cmd.ExecuteReader();                              
                        }
                        catch
                        {
                                RetDataReader   =   null;
                        }
                        finally
                        {
                                Conn.Close();
                        }
                        return   RetDataReader;
                }

------解决方案--------------------
Conn.Close();
====================

连接都关了,还那里有RetDataReader,DataReader是需要永久连接的,如果你的方法返回值需要他(个人不推荐这样做),那么就不能关闭连接!

------解决方案--------------------
1. 如果还是用返回 DataReader的方法,在调用出使用完就关闭连接。虽然CLR会帮我们自动回收垃圾,但这个缺点也是比较明显的,如果忘记关闭连接,可能会产生一些问题。
2. 如果是分层调用,而且打算对数据进行一些更改,可以考虑使用DataSet,这样性能上会有些损耗(占Web服务器的一些内存)