异常详细信息: System.InvalidOperationException: ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。源错误: 
行 232:            myCommand.CommandType = CommandType.Text;
行 233:            SqlDataReader dr = null;
行 234:            dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);//???????????????????????
行 235:
行 236:            return dr;
 源文件: c:\Inetpub\wwwroot\TragramMini\WebTragMini\App_Code\Folder.cs    行: 234 堆栈跟踪: 
[InvalidOperationException: ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。]
   System.Data.SqlClient.SqlConnection.GetOpenConnection(String method) +861892
   System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +9
   System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +101
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +73
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +122
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) +62
   TangramMiniWeb.Folder.GetFolders() in c:\Inetpub\wwwroot\TragramMini\WebTragMini\App_Code\Folder.cs:234
   TangramMiniWeb.MailDesktop.BindFolderData() in c:\Inetpub\wwwroot\TragramMini\WebTragMini\Email\MailDesktop.aspx.cs:29
   TangramMiniWeb.MailDesktop.Page_Load(Object sender, EventArgs e) in c:\Inetpub\wwwroot\TragramMini\WebTragMini\Email\MailDesktop.aspx.cs:23
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint源码为:        public SqlDataReader GetFolders()
        {            ///创建链接
            SqlConnection myConnection = new SqlConnection(conString);
            if(myConnection.State==ConnectionState.Open)
            myConnection.Open();
            ///定义SQL语句
            string cmdText = "SELECT * FROM Folders";
            SqlCommand myCommand = new SqlCommand(cmdText, myConnection);            myCommand.CommandType = CommandType.Text;
            SqlDataReader dr = null;
            dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);//???????????????????????            return dr;
        }        private string conString = ConfigurationManager.AppSettings["EngString"];
特急谢谢
雅琦
 

解决方案 »

  1.   

    if(myConnection.State==ConnectionState.Close) 试试 
      

  2.   

    楼上正解,你if(myConnection.State==ConnectionState.Open) 使程序跳过了myConnection.Open()语句
    所以没有打开数据库连接
      

  3.   

    if(myConnection.State==ConnectionState.Open) -->
    if(myConnection.State==ConnectionState.Closed) 
      

  4.   

      public SqlDataReader GetFolders()
            {            ///创建链接
                SqlConnection myConnection = new SqlConnection(conString);
                if(myConnection.State==ConnectionState.Open)
                myConnection.Open();
                ///定义SQL语句
                string cmdText = "SELECT * FROM Folders ";
                SqlCommand myCommand = new SqlCommand(cmdText, myConnection);            myCommand.CommandType = CommandType.Text;
                SqlDataReader dr = null;
               
              
                if (myConnection.State == ConnectionState.Closed)
                    dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);//???????????????????????
                            return dr;
            }
    改成上面的代码也还是老样子呀??
      

  5.   

    我倒..
    改成这样子:
    public SqlDataReader GetFolders() 
            {             ///创建链接 
                SqlConnection myConnection = new SqlConnection(conString); 
                if(myConnection.State==ConnectionState.CLosed)//改这里 
                myConnection.Open(); 
                ///定义SQL语句 
                string cmdText = "SELECT * FROM Folders"; 
                SqlCommand myCommand = new SqlCommand(cmdText, myConnection);             myCommand.CommandType = CommandType.Text; 
                SqlDataReader dr = null; 
                dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);//???????????????????????             return dr; 
            }         private string conString = ConfigurationManager.AppSettings["EngString"]; 
      

  6.   

    真奇怪呀,有时代码为
    public SqlDataReader GetFolders() 
            {             ///创建链接 
                SqlConnection myConnection = new SqlConnection(conString); 
                 
                myConnection.Open(); 
                ///定义SQL语句 
                 string cmdText = "SELECT * FROM Folders"; 
                SqlCommand myCommand = new SqlCommand(cmdText, myConnection);             myCommand.CommandType = CommandType.Text; 
                SqlDataReader dr = null; 
                dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);//            return dr; 
            } 
    就能行,可有时就不行,还是什么呀
      

  7.   

    楼上怎么才能更加有效的管理好呀。
    请给说说具体的方法。如:
    public SqlDataReader GetFolders() 
            {             ///创建链接 
                SqlConnection myConnection = new SqlConnection(conString); 
                if(myConnection.State==ConnectionState.Open) 
                myConnection.Open(); 
                ///定义SQL语句 
                string cmdText = "SELECT * FROM Folders"; 
                SqlCommand myCommand = new SqlCommand(cmdText, myConnection);             myCommand.CommandType = CommandType.Text; 
                SqlDataReader dr = null; 
                dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);//            return dr; 
            } 
      

  8.   

    CommandBehavior.CloseConnection在MSDN中的解释为:在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。  
    因此数据库的链接取决于你定义的DataReader对象,你用GetFolders()函数所取得的DataReader对象在使用完毕之后应该正确的DataReader.Close()。
    另:if(myConnection.State==ConnectionState.Open)改为if(myConnection.State==ConnectionState.Closed)就能正确的实现,不会出现你说的一会儿行一会儿不行的不正常现象。