我自己做了个小网站,每次类实例化后得到ACCESS连接变量OleDbConnection,感觉这样实例化没有使用静态变量效率高,我试了把连接变量改成了静态,但问题来了,经常报错,说连接出错。想请教各位大侠,有没有更好的方法?可以使用静态变量吗? 谢谢!

解决方案 »

  1.   

    OleDbConnection 不能用静态的。
      

  2.   

    感谢winner2050, 能简单讲一下原因吗?谢谢!
      

  3.   


    //////////////////////////////////////////////////////////////
    //filename: SqlHelper.cs
    //
    //author:
    //
    //date: 2007.10.31
    //
    //description: 数据持久层
    ////////////////////////////////////////////////////////////////using System;
    using System.Collections;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.OleDb;/// <summary>
    /// OleDbHelper 的摘要说明。
    /// </summary>
    public class DBHelper
    {
        public static readonly string oleconstring = System.Configuration.ConfigurationSettings.AppSettings["oleconstring"];
        public DBHelper()
        {    }
        /// <summary>
        /// OleDb数据库增、删、改方法
        /// </summary>
        /// <param name="sql">执行数据库操作语句</param>
        /// <param name="param">参数数组</param>
        /// <returns>返回int类型,返回0则操作失败,返回数大于0则操作成功</returns>
        public static int ExecuteNonquery(string sql, params OleDbParameter[] param)
        {
            int bFlag = 0;
            OleDbCommand cmd = new OleDbCommand();
            using (OleDbConnection con = new OleDbConnection(oleconstring))
            {
                cmd.Connection = con;
                cmd.CommandText = sql;            if (param.Length > 0)
                {
                    foreach (OleDbParameter p in param)
                    {
                        cmd.Parameters.Add(p);
                    }
                }            try
                {
                    if (con.State == ConnectionState.Closed)
                        con.Open();
                    bFlag = cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    string msg = ex.Message;
                }
                finally
                {
                    con.Close();
                }
            }
            return bFlag;
        }    /// <summary>
        /// OleDb数据库查询方法
        /// </summary>
        /// <param name="sql">执行数据库操作语句</param>
        /// <param name="param">参数数组</param>
        /// <returns>返回DataTable类型</returns>
        public static DataTable ExecuteDataTable(string sql, params OleDbParameter[] param)
        {
            DataTable dt = new DataTable();
            OleDbDataAdapter da = new OleDbDataAdapter();
            OleDbCommand cmd = new OleDbCommand();
            da.SelectCommand = cmd;
            using (OleDbConnection con = new OleDbConnection(oleconstring))
            {
                cmd.Connection = con;
                cmd.CommandText = sql;            if (param.Length > 0)
                {
                    foreach (OleDbParameter p in param)
                    {
                        cmd.Parameters.Add(p);
                    }
                }
                try
                {
                    da.Fill(dt);
                }
                catch (Exception ex)
                {
                    string msg = ex.Message;
                }
                finally
                { }
            }
            return dt;
        }    /// <summary>
        /// OleDb数据库查询方法
        /// </summary>
        /// <param name="sql">执行数据库操作语句</param>
        /// <param name="param">参数数组</param>
        /// <returns>返回ArrayList类型</returns>
        public static ArrayList ExecuteArrayList(string sql, params OleDbParameter[] param)
        {
            OleDbDataReader reader = null;
            ArrayList al = new ArrayList();
            OleDbCommand cmd = new OleDbCommand();
            using (OleDbConnection con = new OleDbConnection(oleconstring))
            {
                cmd.Connection = con;
                cmd.CommandText = sql;            if (param.Length > 0)
                {
                    foreach (OleDbParameter p in param)
                    {
                        cmd.Parameters.Add(p);
                    }
                }
                try
                {
                    if (con.State == ConnectionState.Closed)
                        con.Open();
                    reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        al.Add(reader[0]);
                    }
                    //while (reader.Read())
                    //{
                    //    //for (int i = 1; i < reader.FieldCount; i++)
                    //    //{ 
                    //    //    al.Add(reader[i]);
                    //    //}
                    //    foreach (Object obj in reader)
                    //    {
                    //        al.Add(obj);
                    //    }
                    //}
                }
                catch (Exception ex)
                {
                    string msg = ex.Message;
                }
                finally
                { }
            }
            return al;
        }    /// <summary>
        /// OleDb数据库验证方法
        /// </summary>
        /// <param name="sql">执行数据库操作语句</param>
        /// <param name="param">参数数组</param>
        /// <returns>返回bool类型</returns>
        public static bool Exists(string sql, params OleDbParameter[] param)
        {
            OleDbDataReader reader = null;
            bool flag = false;
            OleDbCommand cmd = new OleDbCommand();
            using (OleDbConnection con = new OleDbConnection(oleconstring))
            {
                cmd.Connection = con;
                cmd.CommandText = sql;            if (param.Length > 0)
                {
                    foreach (OleDbParameter p in param)
                    {
                        cmd.Parameters.Add(p);
                    }
                }
                try
                {
                    if (con.State == ConnectionState.Closed)
                        con.Open();
                    reader = cmd.ExecuteReader();
                    if (reader.Read())
                    {
                        flag = true;
                    }
                }
                catch (Exception ex)
                {
                    flag = false;
                    string msg = ex.Message;
                }
                finally
                { }
            }
            return flag;
        }
    }我的ACCESS数据库访问类……LZ参考下吧……
      

  4.   

    使用静态的如果两个请求同时到达那就使用了同一个静态变量了,如果一个执行的比较快后执行到Close语句关闭了连接。而另一个还需要连接,那就出错了
      

  5.   

    try...
    # using System;  
    # using System.Collections.Generic;  
    # using System.Text;  
    # using System.Data;  
    # using System.Data.OleDb;  
    # using System.Data.SqlClient;  
    #   
    # namespace TestAccess  
    # {  
    #     class Program  
    #     {  
    #         static void Main(string[] args)  
    #         {  
    #             #region Access 2007  
    #             Console.WriteLine("Access 2007");  
    #             string strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;";  
    #             strConnection += @"Data Source=C:\Documents and Settings\v-changl\My Documents\Database1.accdb;";  
    #             strConnection += "Persist Security Info=False";  
    #             using (OleDbConnection objConnection = new OleDbConnection(strConnection))  
    #             {  
    #                 objConnection.Open();  
    #                 OleDbDataAdapter myCommandd = new OleDbDataAdapter("select * from Couse", objConnection);  
    #                 DataSet ds = new DataSet();  
    #                 myCommandd.Fill(ds, "couse");  
    #                 DataTable dt = ds.Tables["couse"];  
    #                 Console.WriteLine(dt.Columns[0].ToString());  
    #                 Console.WriteLine(dt.Columns[1].ToString());  
    #                 Console.WriteLine(dt.Columns[2].ToString());  
    #   
    #                 objConnection.Close();  
    #   
    #             }  
    #             #endregion  
    # }  
    # }  
    # }
      

  6.   

    使用access数据库操作类  
    静态遍历常驻内存
       protected static OleDbConnection conn = new OleDbConnection();
        protected static OleDbCommand comm = new OleDbCommand();
        public DataAccess()
        {
        }
        private static void openConnection()
        {
            if (conn.State == ConnectionState.Closed)
            {
                string path = System.Web.HttpContext.Current.Server.MapPath("");
                conn.ConnectionString = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + path;
                comm.Connection = conn;
                try
                {
                    conn.Open();
                }
                catch (Exception e)
                { throw new Exception(e.Message); }
            }
        }
    参考
    参考
      

  7.   

    不妨先暂且理解成,Connection 是独木桥,一次只能一个人过过完了,你还得告诉指挥官,我通过了,别人可以过了(Close)