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

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

.Net自己寫個簡單的ORM(練手)

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

   ORM 大家都知道, .Net 是EF  還有一些其他的ORM  從java 中移植過來的 有 , 大神自己寫的也有 

   不管ORM 提供什么附加的 亂七八糟的功能  

   但是 最主要的 還是 關系映射 的事情。

   我自己一直在使用ORMDapper 這個很小的ORM  第一次看到這個ORM  是通過一個帖子中 有人搞了個常見ORM 效率排行榜 ,自己也試了試  然后就看上 ORMDapper 這個了

   這是把輕量級發揮到極致了! 只有一個 96KB 的 一個Class 文件。其中還有很多是空格和注釋信息。 

   

    最近在學習研究JAVA   覺得JAVA 比.NET  有趣點。  也為了 以后 .NET 不行了  還能弄JAVA  

 

    直接上代碼:

 

      

        PRivate static string ConnectionString = "**";                 /// <summary>        ///  更新數據   沒有sql參數就直接執行          /// </summary>        /// <param name="sql"> 需要執行的 sql </param>        /// <param name="o">傳遞的實體類對象 要求該類中字段必須和 sql參數名稱一致 不區分大小寫 </param>        /// <returns></returns>        public static int UpdateModel(string sql, object o)        {            var s = sql.Split('@');            return Update(sql, s.Length == 1 ? null : GetSqlParameters(o, s));        }        /// <summary>        ///  查詢數據        /// </summary>        /// <typeparam name="T">映射的實體類</typeparam>        /// <param name="sql">執行的SQL語句</param>        /// <param name="o">傳遞的實體類對象 要求該類中字段必須和 sql參數名稱一致 不區分大小寫 </param>        /// <returns></returns>        public static List<T> SeleteModel<T>(string sql, object o) where T : class, new()        {            var s = sql.Split('@');            return Select<T>(sql, s.Length == 1 ? null : GetSqlParameters(o, s));        }        /// <summary>        /// 動態創建SqlParameter 對象        /// </summary>        /// <param name="o">傳遞的實體類對象 要求該類中字段必須和 sql參數名稱一致 不區分大小寫 </param>        /// <param name="s">切割后的SQL 語句</param>        /// <returns></returns>        private static SqlParameter[] GetSqlParameters(object o, string[] s)        {            s = s.Select(c => c.Split(' ')[0].Trim()).ToArray();             Type t = o.GetType();            if (t == typeof(object))                throw new Exception("UpdateModel  傳遞的類型是OBJECT 類型");            // 反射 讀取字段 驗證是否是 SQL 中的參數            var tlist =                t.GetFields(BindingFlags.Public | BindingFlags.Instance)                    .Where(c => c.GetValue(o) != null & s.FirstOrDefault(a => a.ToLower() == c.Name.ToLower()) != null)                    .ToList();            // 判斷得到的數據 是否和 需要的數據 數量一致            if (tlist.Count() != s.Count() - 1)                throw new Exception("傳遞的實體中有值參數 和 sql 中需要的 數量不相等");            SqlParameter[] sp = new SqlParameter[tlist.Count()];            for (int i = 0; i < s.Length - 1; i++)            {                sp[i] = new SqlParameter(s[i + 1].Trim(), tlist.FirstOrDefault(c => c.Name.ToLower() == s[i + 1].ToLower()).GetValue(o));            }            return sp;        }        private static List<T> SeleteModel<T>(SqlDataReader data) where T : class, new()        {            // 獲取列 個數            int iFieldCount = data.FieldCount;            List<T> list = new List<T>();            while (data.Read())            {                T tType = new T();                for (int i = 0; i < iFieldCount; i++)                {                    // 反射注入字段值                    string dataName = data.GetName(i);                    FieldInfo fie = tType.GetType().GetField(dataName);                    if (fie == null)                        continue;                    fie.SetValue(tType, data[dataName]);                }                list.Add(tType);            }            return list;        }        private static List<T> Select<T>(string sql, SqlParameter[] sp) where T : class, new()        {            using (SqlConnection conn = new SqlConnection(ConnectionString))            {                using (SqlCommand com = new SqlCommand(sql, conn))                {                    conn.Open();                    if (sp != null)                        com.Parameters.AddRange(sp);                    return SeleteModel<T>(com.ExecuteReader());                }            }        }        private static int Update(string sql, SqlParameter[] sp)        {            using (SqlConnection conn = new SqlConnection(ConnectionString))            {                using (SqlCommand com = new SqlCommand(sql, conn))                {                    conn.Open();                    if (sp != null)                         com.Parameters.AddRange(sp);                     return com.ExecuteNonQuery();                }            }        }

   調用示例:

  

 public class TestCalss    {        public static void Main()        {            string sql = @"SELECT TOP 1000 [ID]                           ,[ExpressID]                          ,[OrderID]                          ,[MailCode]                           ,[Sendxml]                          ,[SendFlag]                          ,[SendCount]                       FROM [SendStateTest]  where id=@id  and SendXML=@SendXML  ";            string sql2 = @"update [DangDang_SendStateTest] set  SendXML='0000' where id=@id     ";             int i = AdoConnection.UpdateModel(sql2, new Na() { ID = 1 });            List<Na> a = AdoConnection.SeleteModel<Na>(sql, new Na() { ID = 1, SendXML = "0000" });            Console.WriteLine(a);         }        public class Na        {             public int ID;             public string ExpressID;             public string OrderID;             public string MailCode;              public string SendXML;             public int SendFlag;             public int SendCount;        }     }

  

     只是提供一種自己做一個簡單的 ORM 的方式  

     說實話,自己弄的在好,也不如 網上大家都在用的 ORM 框架

     可以在這個簡單的ORM 上經行加工 拓展,  比如 支持存儲過程  不限定數據庫  SQL 語句 分類    等等  

     有興趣的朋友可以自己做做 ,我就不弄了。

     

     


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
麻豆乱码国产一区二区三区| 久久在线视频在线| 欧美精品九九久久| 精品女同一区二区三区在线播放| 欧美福利小视频| 九色精品免费永久在线| 久久夜色撩人精品| 日韩av影片在线观看| 欧美孕妇与黑人孕交| 日韩免费精品视频| 91免费在线视频网站| 国内揄拍国内精品少妇国语| 国产精品偷伦免费视频观看的| 久久中文久久字幕| 亚洲国产精品成人va在线观看| 欧美精品久久久久久久久久| 色哟哟网站入口亚洲精品| 日本欧美中文字幕| 国产精品美女主播| 国产精品视频久久久| 久久人人爽人人爽人人片av高请| 欧美一级大片在线免费观看| 欧美疯狂做受xxxx高潮| 在线观看成人黄色| 久久精品中文字幕免费mv| 日韩av最新在线| 色噜噜狠狠狠综合曰曰曰88av| 中文字幕日韩av电影| 高清欧美性猛交| 亚洲v日韩v综合v精品v| 欧美极品美女视频网站在线观看免费| 68精品国产免费久久久久久婷婷| 色偷偷88888欧美精品久久久| www国产精品com| 日韩中文字幕在线免费观看| 国内精品视频一区| 国产亚洲美女久久| 久久午夜a级毛片| 日韩av在线天堂网| 亚洲999一在线观看www| 热re91久久精品国99热蜜臀| 欧洲亚洲在线视频| 国产精品电影网站| 96精品视频在线| 日韩在线激情视频| 97久久国产精品| 91精品国产综合久久久久久久久| 亚洲成人三级在线| 中文字幕亚洲天堂| 中文字幕亚洲一区二区三区五十路| 亚洲精品乱码久久久久久按摩观| 国内精久久久久久久久久人| 91大神在线播放精品| 精品亚洲国产成av人片传媒| 欧美激情亚洲自拍| 久久精品国产久精国产一老狼| 日韩精品一区二区三区第95| 日韩国产在线播放| 久久视频在线免费观看| 91欧美视频网站| 欧美肥老太性生活视频| 久久久在线视频| 精品免费在线观看| 日韩av免费观影| 亚洲精品自拍第一页| 国产中文字幕91| 国产精品久久电影观看| 欧美日韩爱爱视频| 岛国视频午夜一区免费在线观看| 亚洲va男人天堂| 欧美在线精品免播放器视频| 国产亚洲a∨片在线观看| 欧美性xxxxx极品娇小| www.久久草.com| 亚洲精品电影在线观看| 久久视频免费观看| 98精品国产高清在线xxxx天堂| 亚洲综合一区二区不卡| 国产精品欧美久久久| 91在线视频成人| 日韩精品久久久久| 国产亚洲人成a一在线v站| 91成品人片a无限观看| 成人免费淫片aa视频免费| 欧美在线一区二区三区四| 欧美成人精品不卡视频在线观看| 久久视频在线免费观看| 欧美亚洲另类视频| 亚洲国产精品久久久| 日韩欧美主播在线| 青青草精品毛片| 欧美在线视频一二三| 国产精品96久久久久久| 欧美剧在线观看| 日韩av在线免费| 日韩欧美999| 久久久精品网站| 国产精品va在线播放我和闺蜜| 啪一啪鲁一鲁2019在线视频| 九九热最新视频//这里只有精品| 日韩一区二区福利| 国产欧美在线观看| 日韩高清av在线| 精品国产成人av| 91精品国产91久久久久久久久| 国产成人97精品免费看片| 91在线视频成人| 国产又爽又黄的激情精品视频| 欧美插天视频在线播放| 欧美亚洲视频一区二区| 亚洲成av人乱码色午夜| 国产精品成人品| 国产欧美日韩高清| 亚洲一级片在线看| 一区二区三区黄色| 亚洲成人激情在线观看| 欧美成人免费全部| 欧美性极品xxxx做受| 97色伦亚洲国产| 久久九九国产精品怡红院| 久久久精品中文字幕| 日韩激情在线视频| 欧美日韩视频在线| 97免费视频在线| 欧美野外wwwxxx| 久久亚洲精品成人| 欧美电影在线观看| 中文字幕精品在线| 国产亚洲aⅴaaaaaa毛片| 亚洲欧洲午夜一线一品| 欧美精品videosex牲欧美| 亚洲国产福利在线| 国产午夜精品一区理论片飘花| 国产精品一区二区性色av| 欧美视频专区一二在线观看| www.欧美视频| 欧美二区在线播放| 亚洲第一精品久久忘忧草社区| 精品国产乱码久久久久久天美| 欧美大片在线看| 自拍亚洲一区欧美另类| 亚洲一区二区三区四区在线播放| 久久深夜福利免费观看| 视频直播国产精品| 日韩成人中文字幕在线观看| 日韩欧美一区二区在线| 中文欧美日本在线资源| 美女国内精品自产拍在线播放| 亚洲美女性生活视频| 成人福利网站在线观看11| 国产精品成久久久久三级| 日韩免费在线免费观看| 国产裸体写真av一区二区| 久久精品视频中文字幕| 2019最新中文字幕| 57pao精品| 欧美性20hd另类| 欧美精品www| 欧美老肥婆性猛交视频| 69av视频在线播放| 中文字幕日韩av电影| 国产精品免费网站| 91禁国产网站| 国产精品久久久亚洲|