smhy8187

 

在ASP.NET中写一个数据层基类

在ASP.NET中写一个数据层基类
2007-11-26 17:30

  编写数据访问层代码时,总要一边又一边的重复编写:读数据库连接字符串,建立数据库连接对象,打开连接,创建Command对象,创建数据适配器,创建数据集,填充数据集,关闭连接。这种重复的代码写一两次到还行,写多了就免不了有一些烦了。
  在总结以前的的代码以后,决定重构数据方法层的代码。数据访问层无非进行两种操作:查询返回DataTable,进行插入、更新、删除等无返回值的操作。只要增加一个数据访问层基类包含这些繁琐的代码,其余的数据访问层代码继承数据访问层基类,在调用基类函数时给出存储过程名称和存储过程参数即可。

数据访问层基类代码:
using System;
using System.Data;
using System.Collections;
using System.Data.SqlClient;

namespace DAL
{
    /**//// <summary>
    /// DALBase 的摘要说明。
    /// 数据层访问基类,定义数据层访问公共的变量,方法
    /// </summary>
    public class DALBase
    {
        //定义该类共用变量
        private SqlConnection conn;        //
        private SqlCommand mycm;        //
        private DataSet myds;            //
        private SqlDataAdapter myda;    //
        
        /**//// <summary>
        /// 从web.config中读取数据库连接字符串
        /// </summary>
        private string CONNSTR = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];

        public DALBase()
        {
            //构造函数,创建对象实例
            conn = new SqlConnection(CONNSTR);
            mycm = conn.CreateCommand();
            myds = new DataSet();
            myda = new SqlDataAdapter();
        }

        /**//// <summary>
        /// 通过存储过程返回查询表的信息
        /// </summary>
        /// <param name="sprocName">存储过程名称</param>
        /// <returns>DataTable</returns>
        protected DataTable GetTable(string sprocName)
        {
            conn.Open();
            try
            {
                mycm.CommandText = sprocName;
                mycm.CommandType = CommandType.StoredProcedure;
                myda.SelectCommand = mycm;
                myda.Fill(myds);
            }
            finally
            {
                //无论语句执行正确与否,都关闭连接释放资源
                conn.Close();
            }
            return myds.Tables[0];
        }

        /**//// <summary>
        /// 通过存储过程和参数返回查询表的信息
        /// </summary>
        /// <param name="sprocName"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        protected DataTable GetTable(string sprocName, SqlParameter[] parameters)
        {
            conn.Open();
            try
            {
                mycm.CommandText = sprocName;
                mycm.CommandType = CommandType.StoredProcedure;
                SqlParameterCollection sqlParams = mycm.Parameters;
                //先清空原有的参数
                mycm.Parameters.Clear();
                //给Command添加参数
                foreach ( SqlParameter parameter in parameters )
                {
                    mycm.Parameters.Add( parameter );
                }
                myda.SelectCommand = mycm;
                myda.Fill(myds);
            }
            finally
            {
                //无论语句执行正确与否,都关闭连接释放资源
                conn.Close();
            }
            return myds.Tables[0];
        }


        /**//// <summary>
        /// 通过存储过程及存储过程参数执行对数据库无返回值的操作(如:新增,更新,删除等)
        /// </summary>
        /// <param name="sprocName">存储过程名称</param>
        /// <param name="parameters">存储过程参数</param>
        protected void SaveTale(string sprocName, SqlParameter[] parameters)
        {
            mycm.CommandText = sprocName;
            mycm.CommandType = CommandType.StoredProcedure;
            SqlParameterCollection sqlParams = mycm.Parameters;
            //先清空原有的参数
            mycm.Parameters.Clear();
            //给Command添加参数
            foreach ( SqlParameter parameter in parameters )
            {
                mycm.Parameters.Add( parameter );
            }
            //打开连接
            conn.Open();
            try
            {
                //执行
                mycm.ExecuteNonQuery();
            }
            finally
            {
                //关闭连接
                conn.Close();
            }
        }
    }
}

数据访问层代码:
using System;
using System.Data;
using System.Collections;
using System.Data.SqlClient;

namespace DAL
{
    public class Test : DALBase
    {
        public Test()
        {
        }

        public DataTable GetTestTable()
        {
          return base.GetTable("存储过程名称");
        }

        public DataTable GetTestTableByXName(string XName)
        {
            SqlParameter[] parameters = { new SqlParameter( "@XName",SqlDbType.NVarChar,10 ) };     
            return base.GetTable("存储过程名称",parameters);
        }


        public void AddTestTable(string XName, string Description)
        {
            SqlParameter[] parameters =
            {
                new SqlParameter( "@XName",SqlDbType.NVarChar,10 ),
                new SqlParameter( "@Description",SqlDbType.NVarChar,100)
            };
    
            //设置参数值
            parameters[0].Value = XName;
            parameters[1].Value = Description;
            base.SaveTale("存储过程名称",parameters);
        }
    }
}

  大家有兴趣还可以帮忙扩充一下这个基类,比如增加通过SQL语句返回DataTable,返回单值结果(如:查询合计)……

posted on 2007-12-07 20:55  new2008  阅读(180)  评论(0编辑  收藏  举报

导航