异常详细信息: System.InvalidOperationException: ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。

来源:互联网 发布:java课程设计代码 编辑:程序博客网 时间:2024/05/16 11:39

异常详细信息: 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.Open) 

2.if(myConnection.State==ConnectionState.Closed) 

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

 

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

 

最后我的解决方法为:

我的那个WEB.config的代码我是分头写的,因为这是个中文和英文相加的网站吗,所有我就把中文和英文的配制都分开了,我就又建了个webeng.config 文件最后导制这个英文的配制不能让系统默认,所有有上面的程序错误。呵呵。

我把中文 和英文的配制再放进一个文件时,那所有的数据库的连结又回到了正常 的状态。