当前位置:编程学习 > C#/ASP.NET >>

ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。急,特急啊,这问题找不出来!

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

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

源错误: 


行 146:
行 147: ///读取数据
行 148:        dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
行 149: }
行 150:
 
     源代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

/// <summary>
/// SQLHelper类封装对SQL Server数据库的添加、删除、修改和选择等操作
/// </summary>
public class SQLHelper
{
/// 连接数据源
private SqlConnection con = null;
    private string constr;
private readonly string RETURNVALUE = "RETURNVALUE";
//记录错误日志位置
private static string m_fileName = "c:\\Systemlog.txt";

/// <summary>
/// 打开数据库连接.
/// </summary>
private void Open()
{
// 打开数据库连接
if(con == null)
{   
            constr = System.Configuration.ConfigurationSettings.AppSettings["ConStr"];
            con = new SqlConnection(constr);
}

if(con.State == ConnectionState.Closed)
{
try
{
///打开数据库连接
con.Open();
}
catch(Exception ex)
{
SQLHelper.CreateErrorMsg(ex.Message);
}
finally
{
///关闭已经打开的数据库连接
                con.Close();
}
}
}

/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
///判断连接是否已经创建
if(con != null)
{
///判断连接的状态是否打开
if(con.State == ConnectionState.Open)
{
con.Close();
}
}
}

/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
// 确认连接是否已经关闭
if(con != null)
{
con.Dispose();
con = null;
}
}

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName)
{
SqlCommand cmd = CreateProcCommand(procName,null);
///执行存储过程
cmd.ExecuteNonQuery();
///关闭数据库的连接
Close();

///返回存储过程的参数值
return (int)cmd.Parameters[RETURNVALUE].Value;
}

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <returns>返回存储过程返回值</returns>
public int RunProc(string procName,SqlParameter[] prams)
{
SqlCommand cmd = CreateProcCommand(procName,prams);
///执行存储过程
cmd.ExecuteNonQuery();
///关闭数据库的连接
Close();

///返回存储过程的参数值
return (int)cmd.Parameters[RETURNVALUE].Value;
}

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="dataReader">返回存储过程返回值</param>
public void RunProc(string procName,out SqlDataReader dataReader)
{
 
///创建Command
SqlCommand cmd = CreateProcCommand(procName,null);
    
///读取数据
        dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <param name="dataSet">返回DataReader对象</param>
public void RunProc(string procName,SqlParameter[] prams,out SqlDataReader dataReader)
{
   
///创建Command
SqlCommand cmd = CreateProcCommand(procName,prams);
       

///读取数据
        dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="dataSet">返回DataSet对象</param>
                                         希望各位大侠不吝赐教啊!!!小弟很急很急!这次分给得多!希望大虾们写出具体的方案! --------------------编程问答-------------------- 这是web.config的源码
<?xml version="1.0"?>
<!-- 
    注意: 除了手动编辑此文件以外,您还可以使用 
    Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
     “网站”->“Asp.Net 配置”选项。
    设置和注释的完整列表在 
    machine.config.comments 中,该文件通常位于 
    \Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<!--<appSettings/>
<connectionStrings>
--><!--链接SQL Server数据库的链接字符串-->
      <!--
<add name="SQLCONNECTIONSTRING" connectionString="data Source=(local);database=ShoppingDB;user id=sa;pwd=" providerName="System.Data.SqlClient"></add>
</connectionStrings>-->
  <appSettings>

    <add key="ConStr" value="data source =(local);user id =sa;pwd=;initial catalog =ShoppingDB" />
    
  </appSettings>
<system.web>
<!-- 
            设置 compilation debug="true" 将调试符号插入
            已编译的页面中。但由于这会 
            影响性能,因此只在开发过程中将此值 
            设置为 true。
        -->
<compilation debug="true"/>
<!--
            通过 <authentication> 节可以配置 ASP.NET 使用的 
            安全身份验证模式,
            以标识传入的用户。 
        -->
<authentication mode="Windows"/>
<!--
            如果在执行请求的过程中出现未处理的错误,
            则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
            开发人员通过该节可以配置
            要显示的 html 错误页
            以代替错误堆栈跟踪。

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
</system.web>
</configuration>
--------------------编程问答-------------------- 这是web.config的源码
<?xml version="1.0"?>
<!-- 
    注意: 除了手动编辑此文件以外,您还可以使用 
    Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
     “网站”->“Asp.Net 配置”选项。
    设置和注释的完整列表在 
    machine.config.comments 中,该文件通常位于 
    \Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<!--<appSettings/>
<connectionStrings>
--><!--链接SQL Server数据库的链接字符串-->
      <!--
<add name="SQLCONNECTIONSTRING" connectionString="data Source=(local);database=ShoppingDB;user id=sa;pwd=" providerName="System.Data.SqlClient"></add>
</connectionStrings>-->
  <appSettings>

    <add key="ConStr" value="data source =(local);user id =sa;pwd=;initial catalog =ShoppingDB" />
    
  </appSettings>
<system.web>
<!-- 
            设置 compilation debug="true" 将调试符号插入
            已编译的页面中。但由于这会 
            影响性能,因此只在开发过程中将此值 
            设置为 true。
        -->
<compilation debug="true"/>
<!--
            通过 <authentication> 节可以配置 ASP.NET 使用的 
            安全身份验证模式,
            以标识传入的用户。 
        -->
<authentication mode="Windows"/>
<!--
            如果在执行请求的过程中出现未处理的错误,
            则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
            开发人员通过该节可以配置
            要显示的 html 错误页
            以代替错误堆栈跟踪。

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
</system.web>
</configuration>
--------------------编程问答-------------------- 这是web.config的源码
<?xml version="1.0"?>
<!-- 
    注意: 除了手动编辑此文件以外,您还可以使用 
    Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
     “网站”->“Asp.Net 配置”选项。
    设置和注释的完整列表在 
    machine.config.comments 中,该文件通常位于 
    \Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<!--<appSettings/>
<connectionStrings>
--><!--链接SQL Server数据库的链接字符串-->
      <!--
<add name="SQLCONNECTIONSTRING" connectionString="data Source=(local);database=ShoppingDB;user id=sa;pwd=" providerName="System.Data.SqlClient"></add>
</connectionStrings>-->
  <appSettings>

    <add key="ConStr" value="data source =(local);user id =sa;pwd=;initial catalog =ShoppingDB" />
    
  </appSettings>
<system.web>
<!-- 
            设置 compilation debug="true" 将调试符号插入
            已编译的页面中。但由于这会 
            影响性能,因此只在开发过程中将此值 
            设置为 true。
        -->
<compilation debug="true"/>
<!--
            通过 <authentication> 节可以配置 ASP.NET 使用的 
            安全身份验证模式,
            以标识传入的用户。 
        -->
<authentication mode="Windows"/>
<!--
            如果在执行请求的过程中出现未处理的错误,
            则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
            开发人员通过该节可以配置
            要显示的 html 错误页
            以代替错误堆栈跟踪。

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
</system.web>
</configuration>
--------------------编程问答-------------------- 不知道楼主是否解决这个问题了。我也遇到这个问题了,不知道究竟错在哪。最后我只好显示的打开连接,程序不报错了。楼主若已解决,能否指点一下? --------------------编程问答-------------------- 楼主要打开数据库连接。
以如下方法为例:

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程名称 </param>
/// <param name="prams">存储过程所需参数 </param>
/// <returns>返回存储过程返回值 </returns>
public int RunProc(string procName,SqlParameter[] prams)
{
Open();// 执行方法,打开数据库连接
SqlCommand cmd = CreateProcCommand(procName,prams);
///执行存储过程
cmd.ExecuteNonQuery();
///关闭数据库的连接
Close();
///返回存储过程的参数值
return (int)cmd.Parameters[RETURNVALUE].Value;
}



/// <summary>
        /// 公有方法,获取数据,返回一个SqlDataReader (调用后主意调用SqlDataReader.Close())。
        /// </summary>
        /// <param name="SqlString">Sql语句</param>
        /// <returns>SqlDataReader</returns>
        public SqlDataReader GetDataReader(String SqlString)
        {
            Open();
            SqlCommand cmd = new SqlCommand(SqlString, Connection);
            SqlDataReader dataReader = null;
            try
            {
                dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
                // 记录异常Logger.Log.Error("GetDataReader错误:", ex);
            }
            return dataReader;
        }

调用的时候,SQLHelper help = new SQLHelper();
SqlDataReader myReader = help.GetDataReader("SQL 查询语句"); --------------------编程问答-------------------- 因为DATAREADER读数据的时候,是连接着数据库的。所以,你在使用DATAREADER的时候,要保证数据库连接时打开的。
修改你的代码,如下

public void RunProc(string procName,SqlParameter[] prams,out SqlDataReader dataReader) 

  
///创建Command 
SqlCommand cmd = CreateProcCommand(procName,prams); 
      
//检查cmd的的数据库连接Cvonnection是否是Open的,如果不是就调用一次打开。
///读取数据 
     dataReader = cmd.ExecuteReader(); 
}


记得用完dataReader后关闭连接哦 --------------------编程问答-------------------- using(sqlconnection con=new sqlconnection("server=.;database=db;uid=sa;pwd=sa;"))
{
using(sqlcommand cmd=new sqlcommand("select*from table",con))
{
con.open();
SqlDataReader rder=cmd.ExecuteReader();
return rder["id"].ToString();
}
}
类似于这个,希望有用了! --------------------编程问答-------------------- 我按照5楼的改了,没问题了。谢谢了 --------------------编程问答-------------------- 找找是不是有没有关闭的sqldatareader
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,