Asp.net中打造通用数据访问类(c#)

发布时间: 2007-01-25 03:58    作者: 未知    来源: 未知    浏览:    评论

Asp.net中打造通用数据访问类(c#)
     刚刚写的,可能里面会有漏洞,望指正.
     ASP。NET开发中, 业务实体需要通过数据访问层与数据库交互,因此,你必须为每个业务实体类编写相对应的数据访问层代码。以下代码解决了这个问题: 所有的业务实体只要派生自一个指定的类(这里是SwContent类),那么只须定义他与数据库相对应的字段属性,它所继承的Select(),Insert(),UpDate(),Delete()方法(无须重写)便可以完成(1),从数据库中获取指定数据填充实体类;(2),从指定实体对象获取数据插入到数据库中;(3),从指定实体对象获取数据更新数据库中对应的数据项;(4),删除数据。下面的主要代码是通过属性实现的。其思路是:实体类提供一个共公方法(在他们的基类中实现)可以返回IDataParameter的数组类型。parameterName标记属性名,Value是属性值。数据访问层代码对该数组进行矢代,构造Sql语句后执行操作。

 注意: 业务实体类的公共属性名必须与数据库的相关字段名保持一至,且数据库中的主键要保持一直(这里是Id)。

 为了兼容多层开发模式,我定义了一个 ISwDataProperty接口。SwContent类及他的派生类将实现该接口。

    public interface ISwDataProperty
    {
        int Id
        {
            get; //与数据库的主键对应,且所有表的主键都要相同。
        }

        string Table
        {
            get; //与实体类相对应的数据库表名
        }

        object this[int index]  //存取访问器,主要使用属性实现,代码在后面贴出
        {
            get; 
            set;
        }
 
 void AcceptChanges();    //只用于UpDate时;与DataSet的AcceptChanges()方法作用类似,若不调用,则表示更新数据库中的所有项;调用他,则只更新在调用后所设置的数据项。

        IDataParameter[] GetSwDataParameters();  //返回与实体类相关的参数列表。
    }

 /////////////////////////////////////////////////////////////////////////////
 因此我还定义了SwDataParameter类(我们只需要使用ParameterName,Value两个属性。):
    public class SwDataParameter:IDataParameter
    {
        private object _value;
        private string _parameterName;

        #region IDataParameter 成员

        public DbType DbType
        {
            get
            {
                throw new Exception("The method or operation is not implemented.");
            }
            set
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }

        public ParameterDirection Direction
        {
            get
            {
                throw new Exception("The method or operation is not implemented.");
            }
            set
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }

        public bool IsNullable
        {
            get { throw new Exception("The method or operation is not implemented."); }
        }

        public string ParameterName
        {
            get
            {
                return _parameterName;
            }
            set
            {
                _parameterName = value;
            }
        }

        public string SourceColumn
        {
            get
            {
                throw new Exception("The method or operation is not implemented.");
            }
            set
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }

        public DataRowVersion SourceVersion
        {
            get
            {
                throw new Exception("The method or operation is not implemented.");
            }
            set
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }

        public object Value
        {
            get
            {
                return _value;
            }
            set
            {
                _value = value;
            }
        }

        #endregion
    }

 /////////////////////////////////////////////////////////////////////////////
 
 在贴出业务实体基类的ISwDataProperty实现方式之前,我们定义一个属性类,他只用来做标记(做此标记的属性将不会用来进行与数据库相关连的操作)。

    [AttributeUsage(AttributeTargets.Property)]
    public class SwNotDataParameterAttribute : Attribute
    {
        /// <summary>
        /// 只用做标记,指示该属性不是数据库字段
        /// </summary>
        public SwNotDataParameterAttribute()
        {
        }
    }

 /////////////////////////////////////////////////////////////////
 在ISwDataProperty中定义的3个属性都要加上[SwNotDataParameter()]标记:

    public abstract class SwContent:ISwDataProperty
    {
        protected int _id;
        protected string _table;
        protected object _upDateRef = null;

        public SwContent()
        {
        }

        #region ISwDataProperty 成员

        [SwNotDataParameter()]
        public int Id
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }

        [SwNotDataParameter()]
        public string Table
        {
            get
            {
                return _table;
            }
        }

        [SwNotDataParameter()]
        public object this[int index]
        {
            get
            {
                int i = 0;
                object obj=null;
                foreach (PropertyInfo item in this.GetType().GetProperties())
                {
                    if (item.GetCustomAttributes(typeof(SwNotDataParameterAttribute), true).Length < 1)
                    {
                        if (i == index)
                        {
                            if (item.GetGetMethod().ReturnType == typeof(BoolEnum)) //BoolEnum是我自定义的枚举。
                            {
                                return Convert.ToInt32(item.GetValue(this, null));
                            }
                            obj = item.GetValue(this, null);
                            if (item.GetGetMethod().ReturnType == typeof(string) &&
                                string.IsNullOrEmpty((string)obj))
                            {
                                return string.Empty;
                            }
                            break;
                        }
                        i++;
                    }
                }
                return obj;
            }
            set
            {
                int i = 0;
                foreach (PropertyInfo item in this.GetType().GetProperties())
                {
                    if (item.GetCustomAttributes(typeof(SwNotDataParameterAttribute), true).Length < 1)
                    {
                        if (i == index)
                        {
                            if (item.GetGetMethod().ReturnType == typeof(BoolEnum))
                            {
                                item.SetValue(this, (BoolEnum)value, null);
                                break;
                            }
                            item.SetValue(this, value, null);
                            break;
                        }
                        i++;
                    }
                }
            }
        }

        public void AcceptChanges()
        {
            _upDateRef = this.MemberwiseClone();
        }

        public IDataParameter[] GetSwDataParameters()
        {
            PropertyInfo[] swProInfo = this.GetType().GetProperties();
            int i = 0;
            int j = 0;
            IDataParameter[] _swDataParameters = new SwDataParameter[swProInfo.Length];
            foreach (PropertyInfo item in swProInfo)
            {
                if (item.GetCustomAttributes(typeof(SwNotDataParameterAttribute),true).Length < 1)
                {
                    if (_upDateRef == null || ((ISwDataProperty)_upDateRef)[j].ToString() != this[j].ToString())
                    {
                        _swDataParameters[i] = new SwDataParameter();
                        _swDataParameters[i].ParameterName = item.Name;
                        _swDataParameters[i].Value = this[j];
                        i++;
                    }
                    j++;
                }
            }
            Array.Resize<IDataParameter>(ref _swDataParameters, i);
            return _swDataParameters;
        }

        #endregion

        public void Select()
        {
            _upDateRef = null;
            SwContentOperate.Select(this);
        }

        public virtual bool Insert()
        {
            _upDateRef = null;
            return SwContentOperate.Insert(this);
           
        }

        public bool UpDate()
        {
            return SwContentOperate.UpDate(this);
        }

        public bool Delete()
        {
            return SwContentOperate.Delete(this.Id, this.Table);
        }
    }
}


 ///////////////////////////////////////////////////////////////////////////////////////////////////
 这里是数据访问类:
    public class SwContentOperate
    {
        public static void Select(ISwDataProperty obj)
        {
            try
            {
                SqlConnection newConnect = SwConnect.Create();

                string sql = "select * from "+obj.Table+" where Id="+obj.Id;
                SqlDataAdapter swDataAdapter = new SqlDataAdapter(sql, newConnect);
                newConnect.Open();
                DataSet swDS = new DataSet();
                swDataAdapter.Fill(swDS, obj.Table);
                newConnect.Close();

                DataRow swDataRow = swDS.Tables[0].Rows[0];
                if (swDS.Tables[0].Rows.Count <1)
                {
                    obj = null;
                    swDS.Clear();
                    return;
                }

                IDataParameter[] swPC = obj.GetSwDataParameters();
                int i = 0;
                object objVal = null;
                foreach (IDataParameter item in swPC)
                {
                    try
                    {
                        objVal = swDataRow[item.ParameterName];
                    }
                    catch
                    {
                        objVal = null;
                    }
                    obj[i] = objVal;
                    i++;
                }
                swDS.Clear();
            }
            catch(Exception e)
            {
                throw new SwLogException("ERROR", e);
            }
        }


        public static bool Insert(ISwDataProperty obj)
        {
            try
            {
                SqlConnection newConnect = SwConnect.Create();

                string sql = "insert into "+obj.Table+" (";
                string sqlLast = ")values(";
                SqlCommand swCommand = new SqlCommand();
                SqlParameter swParameter;
                IDataParameter[] swPC = obj.GetSwDataParameters();
                int i = 0;
                foreach (IDataParameter item in swPC)
                {
                    if (i != swPC.Length - 1)
                    {
                        sql += item.ParameterName + ",";
                        sqlLast += "@" + item.ParameterName + ",";
                    }
                    else
                    {
                        sql += item.ParameterName;
                        sqlLast += "@" + item.ParameterName + ")";
                    }
                    swParameter = new SqlParameter();
                    swParameter.ParameterName = "@"+item.ParameterName;
                    swParameter.Value = item.Value;
                    swCommand.Parameters.Add(swParameter);
                    i++;
                }
                swCommand.CommandText = sql + sqlLast;
                swCommand.Connection = newConnect;
                newConnect.Open();
                swCommand.ExecuteNonQuery();
                newConnect.Close();
            }
            catch(Exception e)
            {
                throw new SwLogException("ERROR", e);
            }
            return true;
        }

        public static bool UpDate(ISwDataProperty obj)
        {
            try
            {
                SqlConnection newConnect = SwConnect.Create();

                string sql = "update "+obj.Table+" set ";
                SqlCommand swCommand = new SqlCommand();
                SqlParameter swParameter;
                IDataParameter[] swPC = obj.GetSwDataParameters();
                if (swPC.Length < 1)
                {
                    newConnect.Close();
                    return true;
                }
                int i = 0;
                swCommand.Parameters.Add(new SqlParameter("@Table",obj.Table));
                foreach (IDataParameter item in swPC)
                {
                    if (i != swPC.Length - 1)
                    {
                        sql += item.ParameterName + "=@" + item.ParameterName + ",";
                    }
                    else
                    {
                        sql += item.ParameterName + "=@" + item.ParameterName+" where Id="+obj.Id;
                    }
                    swParameter = new SqlParameter();
                    swParameter.ParameterName = "@"+item.ParameterName;
                    swParameter.Value = item.Value;
                    swCommand.Parameters.Add(swParameter);
                    i++;
                }
                swCommand.CommandText = sql;
                swCommand.Connection = newConnect;
                newConnect.Open();
                swCommand.ExecuteNonQuery();
                newConnect.Close();
            }
            catch
            {
                return false;
            }
            return true;
        }

        public static bool Delete(int id,string table)
        {
            try
            {
                SqlConnection newConnect = SwConnect.Create();

                string sql = "delete from "+table+" where id=" + id;
                SqlCommand swCommand = new SqlCommand(sql, newConnect);
                newConnect.Open();
                swCommand.ExecuteNonQuery();
                newConnect.Close();
            }
            catch
            {
                return false;
            }
            return true;
        }
    }
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 实体类只要继承SwContent类既可。
    public class NewClass:SwContent,ISwDataProperty
    {
        private int _parentId;
        private string _name;
        private string _text;

        public SwContentOperate()
        {
            _table = "DatabaseTable"; //在构造函数中硬编码对应的表名。
        }

        public int ParentId
        {
            get
            {
                return _parentId;
            }
            set
            {
                _parentId = value;
            }
        }
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }
        public string Text
        {
            get
            {
                return _text;
            }
            set
            {
                _text = value;
            }
        }
 ....................

 //////////////////////
 
 页面测试:
 NewClass obj=new NewClass();
 obj.Id=1;
 obj.Select(); //获取数据库数据。
 obj.Text="Test"; 
 obj.UpDate(); //更新数据。
 obj.Text="Test1";
 obj.AcceptChanges(); //前面的设置obj.Text="Test1"将不会被更新到数据库。
 obj.UpDate();

 这是从几个装配件中整理出来的,所以代码比较混乱,如有错误,请海涵。

 

 

 


    



Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多