亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

一步步實現自己的ORM(二)

2019-11-14 16:07:13
字體:
來源:轉載
供稿:網友

在第一篇《一步步實現自己的ORM(一)》里,我們用反射獲取類名、屬性和值,我們用這些信息開發了簡單的INSERT方法,在上一篇文章里我們提到主鍵為什么沒有設置成自增長類型,單單從屬性里我們無法識別哪個是主鍵,今天我們用Attribute來標識列,關于Attribute,引用MSDN里描述

     MADN的定義為:公共語言運行時允許添加類似關鍵字的描述聲明,叫做attributes, 它對程序中的元素進行標注,如類型、字段、方法和屬性等。Attributes和Microsoft .NET Framework文件的元數據(metadata)保存在一起,可以用來向運行時描述你的代碼,或者在程序運行的時候影響應用程序的行為。     我們簡單的總結為:定制特性attribute,本質上是一個類,其為目標元素提供關聯附加信息,并在運行期以反射的方式來獲取附加信息。 

簡單來說Attribute就是描述類、方法、屬性參數等信息的。

可參考《淺析C#中的Attribute》

 

在這里我們定義2個Attribute,用來描述表和字段。

    [AttributeUsage(AttributeTargets.Class)]    class TableAttribute : Attribute    {        /// <summary>        /// 表名        /// </summary>        public string Name { get; PRivate set; }        public TableAttribute(string name)        {            this.Name = name;        }    }    [AttributeUsage(AttributeTargets.Property)]    class ColumnAttribute : Attribute    {        /// <summary>        /// 是否為數據庫自動生成        /// </summary>        public bool IsGenerated { get; set; }        /// <summary>        /// 列名        /// </summary>        public string Name { get; private set; }        public ColumnAttribute(string name)        {            this.Name = name;        }    }
View Code

修改后的實體類如下:

    [Table("tb_Users")]    public class User    {        [Column("UserId",IsGenerated = true)]        public int UserId { get; set; }        [Column("Email")]        public string Email { get; set; }        [Column("CreatedTime")]        public DateTime CreatedTime { get; set; }    }

我們把表結構也修改下

CREATE TABLE [dbo].[tb_Users](    [UserId] [int] NOT NULL identity(1,1) PRIMARY KEY ,    [Email] [nvarchar](100) NULL,    [CreatedTime] [datetime] NULL) 

下面的問題,就是我們如何得到表名和字段名呢?我們還是采用反射來實現,先獲取表名:

         TableAttribute[] tableAttr = (TableAttribute[])typeof(User).GetCustomAttributes(typeof(TableAttribute), true);            if (tableAttr.Length>0)            {                Console.WriteLine(tableAttr[0].Name);            }

運行結果

 

再獲取列名,先查找property,然后找Attribute,代碼如下:

            var properties = typeof(User).GetProperties();            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var columnAttrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (columnAttrs.Length>0)                {                    Console.WriteLine("字段名:{0},是否為自動生成:{1}", columnAttrs[0].Name, columnAttrs[0].IsGenerated);                }            }

運行結果

 

再來修改INSERT 方法如下:

public static int Insert(User user)        {            var type = typeof(User);            Dictionary<string, object> parameters = new Dictionary<string, object>();            var properties = type.GetProperties();            string tableName = string.Empty;            TableAttribute[] tableAttrs = (TableAttribute[])typeof(User).GetCustomAttributes(typeof(TableAttribute), true);            if (tableAttrs.Length > 0)            {                tableName = tableAttrs[0].Name;            }            else {                tableName = type.Name;            }            /*將所有的列放到集合里*/            List<ColumnAttribute> columns = new List<ColumnAttribute>();            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var attrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (attrs.Length > 0)                {                    columns.Add(attrs[0]);                }            }            StringBuilder sql = new StringBuilder();            sql.Append("INSERT INTO [").Append(tableName).Append("](");            int paramIndex = 0;            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var attrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (attrs.Length > 0 && attrs[0].IsGenerated == false)                {                    if (paramIndex > 0)                        sql.Append(",");                    sql.Append(attrs[0].Name);                    paramIndex++;                }            }            sql.Append(") VALUES (");            paramIndex = 0;            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var attrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (attrs.Length > 0 && attrs[0].IsGenerated == false)                {                    if (paramIndex > 0)                        sql.Append(",");                    sql.Append("@p").Append(paramIndex);                    parameters.Add("@p" + paramIndex, pi.GetValue(user, null));                    paramIndex++;                }            }            sql.Append(")");            Console.WriteLine(sql);            SqlConnection conn = new SqlConnection(connectionString);            var cmd = conn.CreateCommand();            cmd.CommandText = sql.ToString();            foreach (var item in parameters)            {                var pa = cmd.CreateParameter();                pa.ParameterName = item.Key;                pa.Value = item.Value ?? DBNull.Value;                cmd.Parameters.Add(pa);            }            conn.Open();            return cmd.ExecuteNonQuery();        }
View Code

運行結果

 

我們再定義一個IdAttribute 類用來表示主鍵,它不需要任何屬性

    [AttributeUsage(AttributeTargets.Property)]    class IdAttribute :ColumnAttribute    {        public IdAttribute(string name) : base(name)        {        }    }

有了主鍵我們下面可以寫UPDATE和DELETE 方法:

UPDATE:

  public static int Update(User user)        {            var type = typeof(User);            Dictionary<string, object> parameters = new Dictionary<string, object>();            var properties = type.GetProperties();            string tableName = string.Empty;            TableAttribute[] tableAttrs = (TableAttribute[])typeof(User).GetCustomAttributes(typeof(TableAttribute), true);            if (tableAttrs.Length > 0)            {                tableName = tableAttrs[0].Name;            }            else            {                tableName = type.Name;            }            StringBuilder sql = new StringBuilder();            sql.Append("UPDATE [").Append(tableName).Append("] SET ");            int paramIndex = 0;            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var idAttrs = (IdAttribute[])pi.GetCustomAttributes(typeof(IdAttribute), true);                if (idAttrs.Length > 0) //如果是主鍵 跳過                    continue;                var columnAttrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (columnAttrs.Length > 0)                 {                    if (paramIndex > 0)                        sql.Append(",");                    // 字段 = @p                    sql.Append(columnAttrs[0].Name).Append("=").Append("@p" + paramIndex);                    /*參數*/                    parameters.Add("@p" + paramIndex, pi.GetValue(user, null));                    paramIndex++;                }            }            sql.Append(" WHERE ");            int keyIndex = 0;            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var idAttrs = (IdAttribute[])pi.GetCustomAttributes(typeof(IdAttribute), true);                if (idAttrs.Length > 0)                {                    if (keyIndex > 0) //考慮到有多個主鍵                        sql.Append(" AND ");                    sql.Append(idAttrs[0].Name).Append("=").Append("@p").Append(paramIndex);                    /*參數*/                    parameters.Add("@p" + paramIndex, pi.GetValue(user, null));                    paramIndex++;                    keyIndex++;                }            }            Console.WriteLine(sql);            SqlConnection conn = new SqlConnection(connectionString);            var cmd = conn.CreateCommand();            cmd.CommandText = sql.ToString();            foreach (var item in parameters)            {                var pa = cmd.CreateParameter();                pa.ParameterName = item.Key;                pa.Value = item.Value ?? DBNull.Value;                cmd.Parameters.Add(pa);            }            conn.Open();            return cmd.ExecuteNonQuery();        }
View Code

調用代碼:

            Update(new User()            {                UserId = 1,                Email = "new@new.com",                CreatedTime = DateTime.Now            });

運行結果:

DELETE方法:

        public static int DeleteByKey(params object[] values)        {            var type = typeof(User);            Dictionary<string, object> parameters = new Dictionary<string, object>();            var properties = type.GetProperties();            string tableName = string.Empty;            TableAttribute[] tableAttrs = (TableAttribute[])typeof(User).GetCustomAttributes(typeof(TableAttribute), true);            if (tableAttrs.Length > 0)            {                tableName = tableAttrs[0].Name;            }            else            {                tableName = type.Name;            }                        /*將所有的列放到集合里*/            List<IdAttribute> columns = new List<IdAttribute>();            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var attrs = (IdAttribute[])pi.GetCustomAttributes(typeof(IdAttribute), true);                if (attrs.Length > 0)                {                    columns.Add(attrs[0]);                }            }            if (columns.Count != values.Length)                throw new ArgumentException("參數個數和主鍵數不一致");            StringBuilder sql = new StringBuilder();            sql.Append("DELETE FROM [").Append(tableName).Append("] ").Append(" WHERE ");            for (int i = 0; i < columns.Count; i++)            {                if (i > 0) //考慮到有多個主鍵                    sql.Append(" AND ");                sql.Append(columns[i].Name).Append("=").Append("@p").Append(i);                /*參數*/                parameters.Add("@p" + i, values[i]);            }            Console.WriteLine(sql);            SqlConnection conn = new SqlConnection(connectionString);            var cmd = conn.CreateCommand();            cmd.CommandText = sql.ToString();            foreach (var item in parameters)            {                var pa = cmd.CreateParameter();                pa.ParameterName = item.Key;                pa.Value = item.Value ?? DBNull.Value;                cmd.Parameters.Add(pa);            }            conn.Open();            return cmd.ExecuteNonQuery();        }
View Code

調用代碼:

 DeleteByKey(1);

運行結果

最后我們把增刪改方法放在一個泛型類里。

    class EntityHelper    {        private const string connectionString = "";        public static int Insert<T>(T entity)        {            var type = typeof(T);            Dictionary<string, object> parameters = new Dictionary<string, object>();            var properties = type.GetProperties();            string tableName = string.Empty;            TableAttribute[] tableAttrs = (TableAttribute[])type.GetCustomAttributes(typeof(TableAttribute), true);            if (tableAttrs.Length > 0)            {                tableName = tableAttrs[0].Name;            }            else            {                tableName = type.Name;            }            /*將所有的列放到集合里*/            List<ColumnAttribute> columns = new List<ColumnAttribute>();            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var attrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (attrs.Length > 0)                {                    columns.Add(attrs[0]);                }            }            StringBuilder sql = new StringBuilder();            sql.Append("INSERT INTO [").Append(tableName).Append("](");            int paramIndex = 0;            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var attrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (attrs.Length > 0 && attrs[0].IsGenerated == false)                {                    if (paramIndex > 0)                        sql.Append(",");                    sql.Append(attrs[0].Name);                    paramIndex++;                }            }            sql.Append(") VALUES (");            paramIndex = 0;            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var attrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (attrs.Length > 0 && attrs[0].IsGenerated == false)                {                    if (paramIndex > 0)                        sql.Append(",");                    sql.Append("@p").Append(paramIndex);                    parameters.Add("@p" + paramIndex, pi.GetValue(entity, null));                    paramIndex++;                }            }            sql.Append(")");            Console.WriteLine(sql);            SqlConnection conn = new SqlConnection(connectionString);            var cmd = conn.CreateCommand();            cmd.CommandText = sql.ToString();            foreach (var item in parameters)            {                var pa = cmd.CreateParameter();                pa.ParameterName = item.Key;                pa.Value = item.Value ?? DBNull.Value;                cmd.Parameters.Add(pa);            }            conn.Open();            return cmd.ExecuteNonQuery();        }        public static int Update<T>(T entity)        {            var type = typeof(T);            Dictionary<string, object> parameters = new Dictionary<string, object>();            var properties = type.GetProperties();            string tableName = string.Empty;            TableAttribute[] tableAttrs = (TableAttribute[])type.GetCustomAttributes(typeof(TableAttribute), true);            if (tableAttrs.Length > 0)            {                tableName = tableAttrs[0].Name;            }            else            {                tableName = type.Name;            }            StringBuilder sql = new StringBuilder();            sql.Append("UPDATE [").Append(tableName).Append("] SET ");            int paramIndex = 0;            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var idAttrs = (IdAttribute[])pi.GetCustomAttributes(typeof(IdAttribute), true);                if (idAttrs.Length > 0) //如果是主鍵 跳過                    continue;                var columnAttrs = (ColumnAttribute[])pi.GetCustomAttributes(typeof(ColumnAttribute), true);                if (columnAttrs.Length > 0)                {                    if (paramIndex > 0)                        sql.Append(",");                    // 字段 = @p                    sql.Append(columnAttrs[0].Name).Append("=").Append("@p" + paramIndex);                    /*參數*/                    parameters.Add("@p" + paramIndex, pi.GetValue(entity, null));                    paramIndex++;                }            }            sql.Append(" WHERE ");            int keyIndex = 0;            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var idAttrs = (IdAttribute[])pi.GetCustomAttributes(typeof(IdAttribute), true);                if (idAttrs.Length > 0)                {                    if (keyIndex > 0) //考慮到有多個主鍵                        sql.Append(" AND ");                    sql.Append(idAttrs[0].Name).Append("=").Append("@p").Append(paramIndex);                    /*參數*/                    parameters.Add("@p" + paramIndex, pi.GetValue(entity, null));                    paramIndex++;                    keyIndex++;                }            }            Console.WriteLine(sql);            SqlConnection conn = new SqlConnection(connectionString);            var cmd = conn.CreateCommand();            cmd.CommandText = sql.ToString();            foreach (var item in parameters)            {                var pa = cmd.CreateParameter();                pa.ParameterName = item.Key;                pa.Value = item.Value ?? DBNull.Value;                cmd.Parameters.Add(pa);            }            conn.Open();            return cmd.ExecuteNonQuery();        }        public static int DeleteByKey<T>(params object[] values)        {            var type = typeof(T);            Dictionary<string, object> parameters = new Dictionary<string, object>();            var properties = type.GetProperties();            string tableName = string.Empty;            TableAttribute[] tableAttrs = (TableAttribute[])type.GetCustomAttributes(typeof(TableAttribute), true);            if (tableAttrs.Length > 0)            {                tableName = tableAttrs[0].Name;            }            else            {                tableName = type.Name;            }            /*將所有的列放到集合里*/            List<IdAttribute> columns = new List<IdAttribute>();            for (int i = 0; i < properties.Length; i++)            {                var pi = properties[i];                var attrs = (IdAttribute[])pi.GetCustomAttributes(typeof(IdAttribute), true);                if (attrs.Length > 0)                {                    columns.Add(attrs[0]);                }            }            if (columns.Count != values.Length)                throw new ArgumentException("參數個數和主鍵數不一致");            StringBuilder sql = new StringBuilder();            sql.Append("DELETE FROM [").Append(tableName).Append("] ").Append(" WHERE ");            for (int i = 0; i < columns.Count; i++)            {                if (i > 0) //考慮到有多個主鍵                    sql.Append(" AND ");                sql.Append(columns[i].Name).Append("=").Append("@p").Append(i);                /*參數*/                parameters.Add("@p" + i, values[i]);            }            Console.WriteLine(sql);            SqlConnection conn = new SqlConnection(connectionString);            var cmd = conn.CreateCommand();            cmd.CommandText = sql.ToString();            foreach (var item in parameters)            {                var pa = cmd.CreateParameter();                pa.ParameterName = item.Key;                pa.Value = item.Value ?? DBNull.Value;                cmd.Parameters.Add(pa);            }            conn.Open();            return cmd.ExecuteNonQuery();        }    }
View Code

大功告成,我們修改下調用代碼

           EntityHelper.Insert(new User()            {                Email = "abc@123.com",                CreatedTime = DateTime.Now            });            EntityHelper.Update(new User()            {                UserId = 1,                Email = "new@new.com",                CreatedTime = DateTime.Now            });            EntityHelper.DeleteByKey<User>(1);

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产电影| 777午夜精品福利在线观看| 亚洲精品电影在线| 国产女同一区二区| 亚洲一级免费视频| 国产成人精品视频| 亚洲欧美变态国产另类| 久久影视三级福利片| 亚洲网站视频福利| 午夜免费日韩视频| 午夜欧美不卡精品aaaaa| 日韩av不卡电影| 欧美野外猛男的大粗鳮| 午夜精品蜜臀一区二区三区免费| 欧美精品在线第一页| 97精品伊人久久久大香线蕉| 国产精品久久电影观看| 日韩欧中文字幕| 国产一区二区在线免费视频| 国产精品美女久久| 成人黄色午夜影院| 久久99热精品| 久久影视电视剧免费网站清宫辞电视| 欧美另类极品videosbestfree| 欧美一级视频一区二区| 亚洲视频在线免费观看| 97久久精品在线| 精品久久久久久亚洲国产300| 亚洲日本欧美中文幕| 国产精品视频在线播放| 国产精品久久久久aaaa九色| 欧美激情区在线播放| 欧美日韩美女在线观看| 91日韩在线播放| 奇米成人av国产一区二区三区| 久久久久久久久爱| 大荫蒂欧美视频另类xxxx| 欧美老肥婆性猛交视频| 亚洲最大成人免费视频| 日韩美女免费线视频| 中文字幕亚洲第一| 亚洲国产成人久久综合一区| 国产欧美一区二区三区久久人妖| 欧美一级淫片videoshd| 最近中文字幕日韩精品| 日韩精品久久久久久久玫瑰园| 久久久亚洲天堂| 欧美—级高清免费播放| 国产国产精品人在线视| 久久精品视频中文字幕| 久久视频国产精品免费视频在线| 欧美猛男性生活免费| 伊人久久综合97精品| 日韩在线高清视频| 欧美黑人一区二区三区| 欧美一区第一页| 亚洲国产婷婷香蕉久久久久久| 成人h片在线播放免费网站| 亚洲自拍偷拍网址| 一夜七次郎国产精品亚洲| 亚洲深夜福利视频| 狠狠久久五月精品中文字幕| 久久视频免费观看| 国产美女直播视频一区| 亚洲国产欧美精品| 亚洲成人1234| 亚洲激情视频在线观看| 中文字幕亚洲无线码在线一区| 成人a在线观看| 欧美另类xxx| 亚洲男人天堂2024| 久久男人资源视频| 亚洲精品欧美日韩专区| 日本国产精品视频| 成人激情视频网| 中文字幕在线看视频国产欧美在线看完整| 91精品国产自产在线老师啪| 日韩亚洲精品视频| 少妇久久久久久| 7m第一福利500精品视频| www.欧美三级电影.com| 国产精品视频久久久| 国产一区二区在线免费视频| 亚洲免费视频一区二区| 欧美电影免费观看高清| 日韩精品视频在线| 久久久久久久网站| 久久综合免费视频影院| 色婷婷综合成人av| 一色桃子一区二区| 国产精品成人在线| 九九热这里只有在线精品视| 欧美性猛交99久久久久99按摩| 久久好看免费视频| 97国产精品人人爽人人做| 性金发美女69hd大尺寸| 亚洲欧洲激情在线| 亚洲一区二区三区sesese| 国产精品9999| 久久久久久久久久久亚洲| 亚洲精品自拍视频| 91九色国产社区在线观看| 久久久久亚洲精品| 97色在线视频观看| 日韩欧美999| 久久久国产精品免费| 精品国内自产拍在线观看| 欧美午夜精品久久久久久人妖| 欧美综合激情网| 国产精品久久9| 久久久久久久久亚洲| 久久视频这里只有精品| 精品久久久久久久久国产字幕| 国产成人一区二区在线| 亚洲午夜女主播在线直播| 91久久久久久国产精品| 5252色成人免费视频| 尤物九九久久国产精品的分类| 国产精品视频网址| 国产精品自拍视频| 国产精品午夜国产小视频| 日韩电影免费观看在线观看| 精品少妇v888av| 成人妇女免费播放久久久| 欧美成人免费全部| 91精品视频在线播放| 欧美精品制服第一页| 精品久久久久久久久久久| 欧洲亚洲免费在线| 久久999免费视频| 欧美另类极品videosbestfree| 亚洲人成网7777777国产| 久久久久五月天| 亚洲欧洲日韩国产| 国产精品视频导航| 国产福利成人在线| 亚洲精品久久7777777| 欧美尺度大的性做爰视频| 亚洲精品福利在线| 欧美影院在线播放| 91九色单男在线观看| 色yeye香蕉凹凸一区二区av| 欧美中文在线免费| 亚洲精品电影网站| 欧美日韩中文字幕综合视频| 国产精品视频26uuu| 日本精品久久中文字幕佐佐木| 日韩精品在线观看网站| 欧美激情精品久久久久久黑人| 成人黄色免费在线观看| 日韩在线视频中文字幕| 日韩视频在线免费观看| 国产热re99久久6国产精品| 色无极亚洲影院| 亚洲天堂免费在线| 亚洲专区在线视频| 国产精品一区二区久久精品| 欧美小视频在线| 欧美午夜片欧美片在线观看| 久久69精品久久久久久国产越南| 欧美最顶级丰满的aⅴ艳星| 日韩在线激情视频| 国产+成+人+亚洲欧洲| 亚洲天堂av在线免费|