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

把数据库载入内存???????????

有这样一个应用场景,

需要不停的链接到数据库(access or ms-sql)比对数据,这个数据库是个静态数据库,数据不会改变。

如果是多线程,不停的open ,close, 这样太影响性能了,有什么方法可以解决这个问题呢? --------------------编程问答-------------------- 直接保存到DataTable或者DataSet不就结了? --------------------编程问答-------------------- datatable   datataset  都是 内存   你想怎么存? --------------------编程问答-------------------- 如果数据量不大做个单例缓存好了
如果太大,就把最常用的那部分缓存下 --------------------编程问答-------------------- 保存到datatable 或 datataset 又怎么条件查询数据呢??? --------------------编程问答-------------------- DataSet 是 内存表 Datatable 的集合 
DataAdpter.fill 来填充数据到 DataSet


public class DataHelper
    {
        // 连接数据源
        public SqlConnection con = null;
        public OleDbConnection conn = null;

        /// <summary>
        /// 数据库连接类型
        /// </summary>
        public enum dbType
        {
            /// <summary>
            /// SQL数据库
            /// </summary>
            sql,
            /// <summary>
            /// access数据库
            /// </summary>
            access
        }
         //连接数据类型
        dbType cType;

        public DataHelper(string conStr,dbType type)
        {
             this.cType = type;
            if (type == dbType.sql)
                con = new SqlConnection(conStr);
            else if (type == dbType.access)
                conn = new OleDbConnection(conStr);
        }

         /// <summary>
        /// 根据SQL查询返回DataSet对象,如果没有查询到则返回NULL
        /// </summary>
        /// <param name="sql">查询语句</param>
        /// <returns>DataSet</returns>
        public DataSet returnDS(string sql)
        {

            DataSet ds = new DataSet();
            try
            {
                if (cType == dbType.sql)
                {
                    SqlCommand cmd = new SqlCommand(sql, con);
                    cmd.CommandTimeout = 20;
                    this.Open();
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    adapter.Fill(ds);

                }
                else if (cType == dbType.access)
                {
                    OleDbCommand cmd = new OleDbCommand(sql, conn);
                    cmd.CommandTimeout = 20;
                    this.Open();
                    System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
                    adapter.Fill(ds);
                }
            }
            catch (Exception e)
            {                
                ds = null;
                throw (e);
            }
            finally
            {
                this.Close();
            }

            return ds;

        }

        /// <summary>
        /// 根据SQL查询返回DataSet对象,如果没有查询到则返回NULL
        /// </summary>
        /// <param name="sql">查询语句</param>
        /// <param name="sRecord">开始记录数</param>
        /// <param name="mRecord">最大记录数</param>
        /// <param name="strTableName">表名</param>
        /// <returns>DataSet</returns>
        public DataSet returnDS(string sql, int sRecord, int mRecord, string strTableName)
        {

            DataSet ds = new DataSet();
            try
            {
                if (cType == dbType.sql)
                {
                    SqlCommand cmd = new SqlCommand(sql, con);
                    cmd.CommandTimeout = 20;
                    this.Open();
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    adapter.Fill(ds, sRecord, mRecord, strTableName);

                }
                else if (cType == dbType.access)
                {
                    OleDbCommand cmd = new OleDbCommand(sql, conn);
                    cmd.CommandTimeout = 20;
                    this.Open();
                    System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
                    adapter.Fill(ds, sRecord, mRecord, strTableName);
                }
            }
            catch (Exception e)
            {
                ds = null;
                throw (e);
               
            }
            finally
            {
                this.Close();
            }

            return ds;

        }

        /// <summary>
        /// 对数据库的增,删,改的操作
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <returns>是否成功</returns>
        public bool OperateDB(string sql)
        {
            bool succeed = false;
            int cnt = 0;
            try
            {
                if (cType == dbType.sql)
                {
                    SqlCommand cmd = new SqlCommand(sql, con);
                    cmd.CommandTimeout = 20;
                    this.Open();
                    cnt = cmd.ExecuteNonQuery();

                }
                else if (cType == dbType.access)
                {
                    OleDbCommand cmd = new OleDbCommand(sql, conn);
                    cmd.CommandTimeout = 20;
                    this.Open();
                    cnt = cmd.ExecuteNonQuery();
                }
            }
            catch (Exception e)
            {
                throw (e);
            }
            finally
            {
                if (cnt > 0)
                {
                    succeed = true;
                }
                this.Close();
            }

            return succeed;
        }

        /// <summary>
        /// 获得该SQL查询返回的第一行第一列的值,如果没有查询到则返回NULL
        /// </summary>
        /// <param name="sql">查询语句</param>
        /// <returns>返回的第一行第一列的值</returns>
        public string getValue(string sql)
        {
            string str = null;
            try
            {
                if (cType == dbType.sql)
                {
                    SqlCommand cmd = new SqlCommand(sql, con);
                    this.Open();
                    str = cmd.ExecuteScalar().ToString();

                }
                else if (cType == dbType.access)
                {
                    OleDbCommand cmd = new OleDbCommand(sql, conn);
                    this.Open();
                    str = cmd.ExecuteScalar().ToString();
                }
            }
            catch (Exception e)
            {
                throw (e);
            }
            finally
            {
                this.Close();
            }

            return str;
        }


        /// <summary>
        ///   获得该SQL查询返回DataTable,如果没有查询到则返回NULL
        /// </summary>
        /// <param name="sql">查询语句</param>
        /// <returns></returns>
        public DataTable getTable(string sql)
        {
            DataTable tb = null;
            DataSet ds = this.returnDS(sql);
            if (ds != null)
            {
                tb = ds.Tables[0];
            }
            return tb;
        }

        /// <summary>
        ///  获得该SQL查询填充到 指定DataTable
        /// </summary>
        /// <param name="tb">指定的Table</param>
        /// <param name="sql"> SQL 语句</param>
        /// <returns></returns>
        public DataTable FillTable(DataTable tb, string sql)
        {

            DataSet ds = tb.DataSet;
            if (ds == null)
            {
                ds = new DataSet();
                ds.Tables.Add(tb);
            }           
            try
            {
                if (cType == dbType.sql)
                {
                    SqlCommand cmd = new SqlCommand(sql, con);
                    cmd.CommandTimeout = 20;
                    this.Open();
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    adapter.Fill(ds,tb.TableName);

                }
                else if (cType == dbType.access)
                {
                    OleDbCommand cmd = new OleDbCommand(sql, conn);
                    cmd.CommandTimeout = 20;
                    this.Open();
                    System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
                    adapter.Fill(ds, tb.TableName);
                }
            }
            catch (Exception e)
            {
                ds = null;
                throw (e);
            }
            finally
            {
                this.Close();
            }


            if (ds != null)
            {
                return ds.Tables[0];
            }
            else
            {
                return null;
            }
         
        }
        
        /// <summary>
        /// 打开数据库连接.
        /// </summary>
        private void Open()
        {
            if (cType == dbType.sql)
            {
                if (con.State == System.Data.ConnectionState.Closed)
                {
                    con.Open();
                }
                else if (con.State == System.Data.ConnectionState.Broken)
                {
                    con.Close();
                    con.Open();
                }
            }
            else if (cType == dbType.access)
            {
                if (conn.State == System.Data.ConnectionState.Closed)
                {
                    conn.Open();
                }
                else if (conn.State == System.Data.ConnectionState.Broken)
                {
                    conn.Close();
                    conn.Open();
                }
            }
        }

        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        public void Close()
        {
            if (cType == dbType.sql)
            {
                if (con != null)
                {
                    con.Close();
                }
            }
            else if (cType == dbType.access)
            {
                if (conn != null)
                {
                    conn.Close();
                }
            }
        }

    }
--------------------编程问答-------------------- 这个 类里 包含 执行SQL 填充Datatable \ DataSet 希望对你有帮助  --------------------编程问答-------------------- 既然是静态数据 可以放Datatable 一次性取出 

DataTable 查询的方法 Select("where条件")


        //
        // 摘要:
        //     按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有 System.Data.DataRow 对象的数组。
        //
        // 参数:
        //   filterExpression:
        //     要用来筛选行的条件。
        //
        // 返回结果:
        //     System.Data.DataRow 对象的数组。
        public DataRow[] Select(string filterExpression);
--------------------编程问答-------------------- 请考虑楼上几位的建议,使用datatable/dataset的办法,如果是ACCESS,有Select("where条件")的办法可以查询,如果是SQLSERVER,那么可以用LINQ TO DATASET,就更方便了。 --------------------编程问答-------------------- 用泛型吧LINQ --------------------编程问答-------------------- 用Linq就行

引用 4 楼 bugttp_yeah 的回复:
保存到datatable 或 datataset 又怎么条件查询数据呢???
--------------------编程问答-------------------- 可以先将数据查询出来.  放到一个集合对象里面  如: List<YourObject> yobject;
然后再用Linq. 很方便的 --------------------编程问答-------------------- --------------------编程问答-------------------- 数据是静态的,就放内存好了。不放内存,也用不着每次open,close,创建个连接放到全局变量共享着用 --------------------编程问答-------------------- 这个问题
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,