上代码先:using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections;
using System.Data.OleDb;/// <summary>
///OleDbHelper 的摘要说明
///此类为抽象类,不允许实例化,在应用时直接调用即可
/// </summary>
public class OleDbHelper
{
    //获取数据库链接字符串,其属于静态变量且只读,项目中的所有文档都可以直接使用,但不可以修改。
    public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    
    // 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。
    private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

    public OleDbHelper()
{
//
//TODO: 在此处添加构造函数逻辑
//
}    /// <summary>
    /// 执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
    /// 使用参数数组形式提供参数列表 
    /// </summary>
    /// <res>
    ///  使用示例:
    ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 
    /// </res>
    /// <param name="connectionString">一个有效的数据库连接字符串</param>
    /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    /// <param name="cmdText">存储过程的名字或者 T-SQL 语句</param>
    /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
    public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params OleDbParameter[] commandParameters)
    {
        OleDbCommand cmd = new OleDbCommand();        using (OleDbConnection conn = new OleDbConnection(connectionString))
        {
            //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中
            PrePareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);            int val = cmd.ExecuteNonQuery();            //清空OleDbCommand中的参数
            cmd.Parameters.Clear();
            return val;
        }
    }
    /// <summary>
    /// 执行一个结果集的OleDbCommand命令,通过指定专用的连接字符串。
    /// 使用参数数组形式提供参数列表 
    /// </summary>
    /// <param name="connectionString"></param>
    /// <param name="cmdType"></param>
    /// <param name="cmdText"></param>
    /// <param name="commandParameters"></param>
    /// <returns>ds</returns>
    public static DataSet ExecuteDataSet(string connectionString, CommandType cmdType, string cmdText, params OleDbParameter[] commandParameters)
    {
        OleDbConnection conn = new OleDbConnection(connectionString);
        OleDbCommand cmd = new OleDbCommand();        PrePareCommand(cmd,conn,null,cmdType,cmdText,commandParameters);        using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            da.Fill(ds);
            cmd.Parameters.Clear();            return ds;
        }
    }
    /// <summary>
    /// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。
    /// 使用参数数组提供参数
    /// </summary>
    /// <res>
    /// 使用示例:  
    ///  OleDbDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new OleDbParameter("@prodid", 24));
    /// </res>
    /// <param name="connectionString"></param>
    /// <param name="cmdType"></param>
    /// <param name="cmdText"></param>
    /// <param name="commandParameters"></param>
    /// <returns></returns>
    public static OleDbDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params OleDbParameter[] commandParameters)
    {
        OleDbCommand cmd = new OleDbCommand();
        OleDbConnection conn = new OleDbConnection(connectionString);        // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在,
        //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。
        //关闭数据库连接,并通过throw再次引发捕捉到的异常。
        try
        {
            PrePareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);            OleDbDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);            cmd.Parameters.Clear();            return rdr;
        }
        catch
        {
            conn.Close();
            throw;
        }
    }    /// <summary>
    /// 执行一条返回第一条记录第一列的OleDbCommand命令,通过专用的连接字符串。 
    /// 使用参数数组提供参数
    /// </summary>
    /// <res>
    /// 使用示例:  
    ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new OleDbParameter("@prodid", 24));
    /// </res>
    /// <param name="connectionString">一个有效的数据库连接字符串</param>
    /// <param name="commandType">OleDbCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    /// <param name="commandParameters">以数组形式提供OleDbCommand命令中用到的参数列表</param>
    /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
    public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params OleDbParameter[] commandParameters)
    {
        OleDbCommand cmd = new OleDbCommand();        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            PrePareCommand(cmd,connection,null,cmdType,cmdText,commandParameters);            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();            return val;
        }
    }    /// <summary>
    /// 为执行命令准备参数
    /// </summary>
    /// <param name="cmd">OleDbCommand 命令</param>
    /// <param name="conn">已经存在的数据库链接</param>
    /// <param name="trans">数据库事务处理</param>
    /// <param name="cmdType">OleDbCommand命令类型(存储过程,T-SQL语句,等等。)</param>
    /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param>
    /// <param name="cmdParms">返回带参数的命令</param>
    private static void PrePareCommand(OleDbCommand cmd, OleDbConnection conn, OleDbTransaction trans, CommandType cmdType, string cmdText, OleDbParameter[] cmdParms)
    {
        //判断数据库链接状态
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }
        cmd.Connection = conn;
        cmd.CommandText = cmdText;        //判断是否需要事务处理
        if (trans != null)
        {
            cmd.Transaction = trans;
        }
        cmd.CommandType = cmdType;        if (cmdParms != null)
        {
            foreach( OleDbParameter parm in cmdParms)
            {
                cmd.Parameters.Add(parm);
            }
        }    }
}大家重点先看OleDbDataReader这个方法我的调用是这样的:
 using (OleDbDataReader dr = OleDbHelper.ExecuteReader(OleDbHelper.ConnectionStringLocalTransaction, CommandType.Text, oledb_select_about, null))
        {
            if (dr.Read())
            {
                ltAbout.Text = subStr(dr["content"].ToString(),290);
            }
            dr.Close();
        }
当频繁的请求的时候出现错误提示:行 166:        if (conn.State != ConnectionState.Open)
行 167:        {
行 168:            conn.Open();
行 169:        }
行 170:        cmd.Connection = conn;
 老是提示这有错误,不知道是什么原因,想跟踪调试一下吧,在VS中的调试确实正常的。高手指点!!!!!!!!!!!

解决方案 »

  1.   

    Access 数据库的特点.并发访问很小.
      

  2.   

    SqlHelper只负责执行,打开,关闭连接需要自己动手
      

  3.   

    ACCESS自带的帮助文档中搜索规格,会有所有ACCESS数据库的上限。 
    并发用户的个数 255 
    加锁来实现并发控制。驱动程序根据LDB文件来进行锁的控制
    使用sql server
      

  4.   

     using (OleDbDataReader dr = OleDbHelper.ExecuteReader(OleDbHelper.ConnectionStringLocalTransaction, CommandType.Text, oledb_select_about, null))
            {
                if (dr.Read())
                {
                    ltAbout.Text = subStr(dr["content"].ToString(),290);
                }
                dr.Close();
            }
     改成
     using (OleDbDataReader dr = OleDbHelper.ExecuteReader(OleDbHelper.ConnectionStringLocalTransaction, CommandType.Text, oledb_select_about, null))
            {
                if (dr.Read())
                {
                    ltAbout.Text = subStr(dr["content"].ToString(),290);
                }
            }
     不用关闭
     在using里使用完了会自动释放
      

  5.   

    SqlHelper是有个经典的BUG ,好多年了是关于sqlcommand对象超时的
      

  6.   


    提示错误就是在oledbhelper类中的PrePareCommand方法中,频繁访问的时候就提示 if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
    这有错误了!但是在vS中调试却发现不了错误!!Sandy945 老兄指点一下!!
      

  7.   

    SqlHelper 用不的,一并发就出问题
      

  8.   

    报什么错 还有啊非 那个经典的BUG 是什么 我现在的项目用的是sqlhelper 说下 我好改
      

  9.   


    晕,我不是说过了,没看到那三行红色的吗,就是连接那出错!!!!!!!!!!!!!!!
    conn.open();其他没什么错误提示了
      

  10.   


    就是连接的错误,该怎么改啊?,是不是因为那个reader没有关闭引起的呢?
      

  11.   

    感谢各位的回帖,问题没有更好的解决,不过我发现了一个有效的方法:在类中的每个方法中手动的关闭以下sql链接就行了,reader除外!