<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一個簡易的ORM框架的實現(二)

      框架目標

      什么是框架,框架能做到什么?

      把一個方向的技術研發做封裝,具備通用性,讓使用框架的開發者用起來很輕松。

      屬性:

      1. 通用性
      2. 健壯性
      3. 穩定性
      4. 擴展性
      5. 高性能
      6. 組件化
      7. 跨平臺

      從零開始-搭建框架

      1. 建立項目
      2. 主鍵查詢功能開發
      3. 綁定實體

      一步一步的給大家推導:
      一邊寫一邊測試

      從零開始--搭建框架

      1. 創建項目

      首先,創建兩個類庫一個名為Models保存我們的模型,一個名為DbProxy的類庫保存我們對數據庫的核心操作。

      先進行我們查詢功能的編寫,暫時不考慮通用性。

      public class DbProxyCore
      {
          public Commodity GetCommodity(int id)
          {
              string connectionString = "Data Source=10.10.32.242;Initial Catalog=AdvancedCustomerDB;Persist Security Info=True;User ID=sa;Password=*******";
              Commodity commodity = new Commodity();
              using (var connection = new SqlConnection(connectionString))
              {
                  connection.Open();
      
                  string sql = @"SELECT [Id]
                                  ,[ProductId]
                                  ,[CategoryId]
                                  ,[Title]
                                  ,[Price]
                                  ,[Url]
                                  ,[ImageUrl]
                                  FROM [dbo].[Commodity] where Id="+id;
      
                  SqlCommand sqlCommand= connection.CreateCommand();
                  sqlCommand.CommandText = sql;
                  SqlDataReader reader= sqlCommand.ExecuteReader();//數據集的讀取器
                 
                   if (reader.Read())
                  {
                      commodity.Id = Convert.ToInt32(reader["Id"]);
                      commodity.ProductId = Convert.ToInt64(reader["ProductId"]);
                      commodity.CategoryId = Convert.ToInt32(reader["CategoryId"]);
                      commodity.Title = reader["Title"].ToString();   
                      commodity.Price = Convert.ToDecimal(reader["Price"]);
                      commodity.Url = reader["Url"].ToString();
                      commodity.ImageUrl = reader["ImageUrl"].ToString();                    
                  }
                  
              }
              return commodity;
          }
      }
      

      當我們又創建一個其他的model對象的時候,就遇到一個問題,難道我們需要每次都進行不同對象的獨有的方法的創建嗎?
      并不是,這里就可以通過泛型來完成它們獨有的方法
      暫時的改造

        public T Find<T>(int id) where T : new()
        {
            string connectionString = """
                Data Source=10.10.32.242;Initial Catalog=AdvancedCustomerDB;Persist Security Info=True;User ID=sa;Password=*********;
                """;
            T obj = new T();
            using (var connection = new SqlConnection(connectionString))
            {
                connection.Open();
      
                string sql = @"SELECT [Id]
                                ,[ProductId]
                                ,[CategoryId]
                                ,[Title]
                                ,[Price]
                                ,[Url]
                                ,[ImageUrl]
                                FROM [dbo].[Commodity] where Id=" + id;
      
                SqlCommand sqlCommand = connection.CreateCommand();
                sqlCommand.CommandText = sql;
                SqlDataReader reader = sqlCommand.ExecuteReader();//數據集的讀取器
      
                if (reader.Read())
                {
                    //commodity.Id = Convert.ToInt32(reader["Id"]);
                    //commodity.ProductId = Convert.ToInt64(reader["ProductId"]);
                    //commodity.CategoryId = Convert.ToInt32(reader["CategoryId"]);
                    //commodity.Title = reader["Title"].ToString();
                    //commodity.Price = Convert.ToDecimal(reader["Price"]);
                    //commodity.Url = reader["Url"].ToString();
                    //commodity.ImageUrl = reader["ImageUrl"].ToString();
                }
      
            }
            return obj;
        }
             
      

      嘗試運行,可以正確的運行,并不報錯。

      我們要給對象的屬性賦值,不能通過new一個對象,直接調用對象的屬性賦值;
      這里就可以使用到我們的反射技術。

        public T Find<T>(int id) where T : new()
        {
            string connectionString = """
                Data Source=10.10.32.242;Initial Catalog=AdvancedCustomerDB;Persist Security Info=True;User ID=sa;Password=7ujm&UJM;
                """;
            //T obj = new T();
            Type type = typeof(T);
            object? oResult = Activator.CreateInstance(type);
      
            using (var connection = new SqlConnection(connectionString))
            {
                connection.Open();
      
                string sql = @"SELECT [Id]
                                ,[ProductId]
                                ,[CategoryId]
                                ,[Title]
                                ,[Price]
                                ,[Url]
                                ,[ImageUrl]
                                FROM [dbo].[Commodity] where Id=" + id;
      
                SqlCommand sqlCommand = connection.CreateCommand();
                sqlCommand.CommandText = sql;
                SqlDataReader reader = sqlCommand.ExecuteReader();//數據集的讀取器
      
                if (reader.Read())
                {
                    //commodity.Id = Convert.ToInt32(reader["Id"]);
                    //commodity.ProductId = Convert.ToInt64(reader["ProductId"]);
                    //commodity.CategoryId = Convert.ToInt32(reader["CategoryId"]);
                    //commodity.Title = reader["Title"].ToString();
                    //commodity.Price = Convert.ToDecimal(reader["Price"]);
                    //commodity.Url = reader["Url"].ToString();
                    //commodity.ImageUrl = reader["ImageUrl"].ToString();
                    foreach (var prop in type.GetProperties())
                    {                        
                      prop.SetValue(oResult, reader[prop.Name]);
                                                              
                    }
                }
      
            }
            return (T)oResult;
        }
      

      還有就是sql語句的問題,如何通過T來生成不同的sql語句。
      sql語句應該依賴于我們的泛型T,也通過T來動態生成不同的SQl的語句。

       public T Find<T>(int id) where T : new()
       {
           string connectionString = """
               Data Source=10.10.32.242;Initial Catalog=AdvancedCustomerDB;Persist Security Info=True;User ID=sa;Password=********;
               """;
           //T obj = new T();
           Type type = typeof(T);
           object? oResult = Activator.CreateInstance(type);
      
           using (var connection = new SqlConnection(connectionString))
           {
               connection.Open();
      
               List<string> propNameList = type.GetProperties().Select(c => c.Name).ToList();
               string strProps = string.Join(",", propNameList);
      
               string sql = $"SELECT {strProps} FROM {type.Name} where Id=" + id;
               //以逗號分割的數據庫表的字段名稱。
             
      
               SqlCommand sqlCommand = connection.CreateCommand();
               sqlCommand.CommandText = sql;
               SqlDataReader reader = sqlCommand.ExecuteReader();//數據集的讀取器
      
               if (reader.Read())
               {
                   foreach (var prop in type.GetProperties())
                   {                        
                     prop.SetValue(oResult, reader[prop.Name]);
                                                             
                   }
               }
      
           }
           return (T)oResult;
       }
      

      處理DBNULL的問題

      prop.SetValue(oResult, reader[prop.Name] is DBNull ? null : reader[prop.Name]) ;
      

      這里還需要考慮如何避免傳入如何的實體,導致報錯的問題。
      使用基類約束就能避免這個問題了。

      posted @ 2023-09-22 16:04  飄雨的河  閱讀(265)  評論(0)    收藏  舉報
      主站蜘蛛池模板: h无码精品3d动漫在线观看| 国产超碰无码最新上传| 可以在线观看的亚洲视频| 国内精品一区二区在线观看| 高潮喷水抽搐无码免费| 翘臀少妇被扒开屁股日出水爆乳| 精品国产中文字幕懂色| 和艳妇在厨房好爽在线观看| 亚洲精品麻豆一区二区| 亚洲精品国产一区二区三| 久久国产乱子伦免费精品无码| 中文有无人妻vs无码人妻激烈| 91中文字幕一区二区| 欧美激情一区二区三区成人| 通河县| 国产三级精品三级在线区| 中文字幕一区二区三区麻豆| 蜜桃视频一区二区在线观看| av天堂午夜精品一区| 中文国产日韩欧美二视频| 久久精品国产www456c0m| 国产在线98福利播放视频| 国产口爆吞精在线视频2020版| 秋霞电影网| 日本丶国产丶欧美色综合| 无码成人午夜在线观看 | 亚洲熟女乱综合一区二区| 天干天干夜啦天干天干国产| 京山县| 国产精品一区二区三区自拍| 天天躁久久躁日日躁| 在线精品另类自拍视频| 杂多县| 亚洲国产免费图区在线视频 | 中文字幕人妻精品在线| 国产大学生自拍三级视频| 亚洲精品久综合蜜| 国产偷拍自拍视频在线观看| 韩国18禁啪啪无遮挡免费| 亚洲欧美日韩在线码| 国产精品户外野外|