zoukankan      html  css  js  c++  java
  • 定义通用访问数据库类

         最近在公司看封装的代码,访问数据库很方便,我们只需定义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;
            }
    
  • 相关阅读:
    理解OO 思想 架构好一个程序之基石!~
    WP7 ZIP 压缩与解压缩
    Gis LBS 应用 剧本 (自己乱想的)
    PHP 入门 环境搭建
    Android 入门必须知道的 英文缩写
    Android 开发 数据结构理解 队列和栈 分析及实现
    c函数中形参为引用的情况;C++中*a和*&a的区别
    如何在.NET中使用尾递归
    [ProjectEuler.net] 25 找到第一个fib数,数位为1000位
    NFA_DFA
  • 原文地址:https://www.cnblogs.com/DebugMe/p/4177332.html
Copyright © 2011-2022 走看看