说明: 执行当前 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>
                                         希望各位大侠不吝赐教啊!!!小弟很急很急!这次分给得多!希望大虾们写出具体的方案!

解决方案 »

  1.   

    这是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>
      

  2.   

    这是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>
      

  3.   

    这是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>
      

  4.   

    楼主要打开数据库连接。
    以如下方法为例:/// <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 查询语句");
      

  5.   

    因为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后关闭连接哦
      

  6.   

    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();
    }
    }
    类似于这个,希望有用了!
      

  7.   

    找找是不是有没有关闭的sqldatareader