首页 > 代码库 > 定义通用访问数据库类

定义通用访问数据库类

     最近在公司看封装的代码,访问数据库很方便,我们只需定义Model,便可访问数据库,当然了都是封装的dll,因此自己也试着写了一个,现在做个记录。

下面是特性标签的定义,主要用于获取本地属性定义和数据库定义以及数据库字段定义:

 public class DataMappingAttribute : Attribute    {        private string localName, dbName;        private string type;        public DataMappingAttribute(string a, string b, DbType type)        {            this.localName = a;            this.dbName = b;            this.type = "System." + type.ToString();        }        public string LocalName        {            get { return localName; }        }        public string DbName { get { return dbName; } }        public string DataType { get { return type; } }    }

 下面是数据库访问后,生成实体模型数据列表,主要用到泛型,反射技术,先生成Datatable定义,然后用数据库数据填充,遍历每一个行数据,根据自定义属性,确定数据和对象是如何一一对应的:

public class DataCommand    {        private const string ConnStr = "Data Source=.;Initial Catalog=xxx;User Id=sa;Password=xxx;";        public List<T> Exe<T>(string cmdStr)        {            var resList = new List<T>();            var dt = new DataTable();            /*数据库字段与Datatable绑定*/            var type = typeof(T);            var fieldList = type.GetProperties();            foreach (var filed in fieldList)            {                var attributes = filed.GetCustomAttributes(typeof(DataMappingAttribute), false);                var ab = (DataMappingAttribute)attributes[0];                dt.Columns.Add(ab.DbName,Type.GetType(ab.DataType));            }                        using (var connection = new SqlConnection(ConnStr))            {                connection.Open();                var cmd = new SqlCommand {Connection = connection};                cmd.CommandText = cmdStr;                var dataAdapter = new SqlDataAdapter(cmd);                dataAdapter.Fill(dt);                connection.Close();            }            foreach (DataRow row in dt.Rows)            {                var objT = Activator.CreateInstance<T>();                foreach (var filed in fieldList)                {                    var attributes = filed.GetCustomAttributes(typeof(DataMappingAttribute), false);                    var tempName = "";                    foreach (var attr in attributes)                    {                        var attri = (DataMappingAttribute)attr;                        if (attri.LocalName.Equals(filed.Name))                            tempName = attri.DbName;                    }                                       if (!filed.CanWrite ||string.IsNullOrWhiteSpace(tempName)) continue;                    filed.SetValue(objT,row[tempName], null);                }                resList.Add(objT);            }            return resList;        }

 

定义通用访问数据库类