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

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

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

      WizardWu 編程網

      一位臺灣的工程師,接觸 .NET 逾十年,近年研究 SQL Server、Performance Tuning、手機應用

      博客園 首頁 新隨筆 聯系 訂閱 管理

      自己寫的一個 web 版簡易 C# Code Generator,可快速產生某個數據庫中,所有表 Mapping 的 C# 3.0 類。可當作網站分層開發、表單大量傳遞用戶輸入值、在內存里持久化保存值之用,亦可當作 NHibernate 等 O/R Mapping 框架套用時的 C# 代碼生成器。

      因敝人覺得 CodeSmith、MyGeneration 軟件產生的類和代碼太復雜,不見得符合自己所需,甚至市面上有些代碼生成器還要收費,遂自己隨手用 ASP.NET 寫了一個代碼生成器,并分享出來。功能尚簡,以后有時間再繼續擴充。

      -------------------------------------------------
      本帖的示例下載點:
      https://files.cnblogs.com/WizardWu/091216.zip

      (執行本示例,需要 SQL Server 的 Northwind 數據庫,以及 VS 2008 或 IIS)
      -------------------------------------------------

      雙擊 CodeGenerator.sln,開啟網站后,如下圖 1,下拉菜單中,會自動擷取網站 Web.config 中,一至多個數據庫連接的字符串。



      圖 1 程序執行畫面,用戶可自定義要生成的 C# 類其部分內容


      圖 2 程序會自動擷取 Web.config 中的一至多個數據庫連接字符串


      如下圖 3,單擊「列出此數據庫的所有表」按鈕后,會在 GridView 控件中,列出這個數據庫的所有「表 (Table)」和「視圖 (View)」。用戶可逐一勾選,或全選要創建的表之后,再單擊「開始創建」按鈕即可。



      圖 3 創建后的 C# 類,會自動產生在此網站  底下的 Entities 文件夾里


      下圖 4 為創建的 C# 類其內容。C# 的類型,會和數據庫中的類型自動做對應,例如 string 對應 varchar、Int16 對應 smallint。當然您可視自己的需求,修改代碼再擴充。



      圖 4 創建的 C# 類其內容,用戶可選擇是否要加入 NHibernate 的 Attribute


      本示例用了一個 ADO.NET 書上教的技巧,搭配 DataReader,在單一次的數據庫 connection 中,一次就取回多句 SQL 語句,所要擷取的多個 ResultSet (此為多行多列的二維類型數據), 以提升程序性能,如下方代碼所示:

       

      genDataSet()
      1 using (SqlConnection conn = new SqlConnection(strConnString))
      2 {
      3 conn.Open();
      4 using (SqlCommand cmd = new SqlCommand())
      5 {
      6 cmd.Connection = conn;
      7 cmd.CommandText = strSql;
      8 using (SqlDataReader dr = cmd.ExecuteReader())
      9 {
      10 //多次頡取 ResultSet (多行多列的二維類型數據)
      11   for (int ii = 0; ii < intDataTableCount; ii++ )
      12 {
      13 dtInsertInput = new DataTable();
      14
      15 dcInsertInput = new DataColumn();
      16 dcInsertInput.DataType = Type.GetType("System.String");
      17 dcInsertInput.ColumnName = "TableName";
      18 dtInsertInput.Columns.Add(dcInsertInput);
      19
      20 dcInsertInput = new DataColumn();
      21 dcInsertInput.DataType = Type.GetType("System.String");
      22 dcInsertInput.ColumnName = "ColumnName";
      23 dtInsertInput.Columns.Add(dcInsertInput);
      24
      25 dcInsertInput = new DataColumn();
      26 dcInsertInput.DataType = Type.GetType("System.String");
      27 dcInsertInput.ColumnName = "DataType";
      28 dtInsertInput.Columns.Add(dcInsertInput);
      29
      30 while (dr.Read())
      31 {
      32 drInsertInput = dtInsertInput.NewRow();
      33 drInsertInput["TableName"] = dr.GetString(1);
      34 drInsertInput["ColumnName"] = dr.GetString(2);
      35 drInsertInput["DataType"] = dr.GetString(6);
      36 dtInsertInput.Rows.Add(drInsertInput);
      37 //Response.Write(dr.GetString(1) + ", " + dr.GetString(2).ToString() + ", " + dr.GetString(6).ToString() + "<br>");
      38   }
      39
      40 //將這一次擷取的 ResultSet,存入一個新的 DataTable 后,再把這一個 DataTable 存入 DataSet 里
      41   ds.Tables.Add(dtInsertInput);
      42
      43 //dtInsertInput.Clear();
      44  
      45 dr.NextResult(); //到 DataReader 的下一個 ResultSet 繼續讀取數據
      46  
      47 Label1.Text += "已經創建了第 " + ds.Tables.Count + " 個類<br>";
      48 }
      49 }
      50
      51 dcInsertInput.Dispose();
      52 dtInsertInput.Dispose();
      53 }
      54 }
      55  

       


      有關此 ADO.NET 的小技巧,有興趣的網友可參考這篇文章:

      使用 ADO.NET 的 NextResult 方法取得多個 Result Set
      http://www.rzrgm.cn/WizardWu/archive/2008/07/11/1241174.html


      有些網站系統的設計,會采用「分層式; 多層式 (n-Tier)」的架構,如下圖 5 所示。在 Layer 與 Layer 之間的數據傳遞,或電子表單中用戶所輸入的多個字段值的傳遞,亦可透過此種 Mapping 映射類的 instance,來幫忙傳遞大量的數據;還有些 Java/J2EE 的書中會提到,可再將這些數據暫存在內存中,以做一些「持久性 (persistence)」的延伸應用,這些暫存在內存里的 class 的多個字段值,以后隨時可從內存中取出再使用。

       



      圖 5 分層的網站系統,透過 Model 實例層、C# 實例 (instance),幫忙傳遞用戶在表單中輸入的大量數據

       

      Model 實例層
      namespace com.公司名稱.項目名稱.Model
      {
      public class Product //此一「類」的名稱,會對應至數據庫的同名「數據表」Product
      {
      private int _id; //此為 .NET 的「字段(field)」,對應至 Product 表的同名「字段」ID
      private string _name;
      private decimal _price;
       

      public int ID //此為 .NET 的「屬性(property)」,對應至 Product 表的同名「字段」ID
      {
      set { _id = value; }
      get { return _id; }
      }
       
              public decimal Price
      {
      set { _price = value; }
      get { return _price; }
      }

              public string Name
              {
                 
      set { _name = value; }
                 
      get { return _name; }
              }
          }
      }

       

      View 展示層
      public partial class _Default : System.Web.UI.Page
      {
      //用戶單擊 submit 送出按鈕,欲「添加」一筆記錄到數據庫的 Product 表
      protected void Button1_Click(object sender, EventArgs e)
      {
      com.公司名稱.項目名稱.Model.Product model
      = new com.公司名稱.項目名稱.Model.Product(); //一個 Model 實例層的對象

      com.公司名稱.項目名稱.BLL.Product bll
      = new com.公司名稱.項目名稱.BLL.Product(); //一個 BLL 層的對象 

      model.ID = TextBox1.Text;      //將用戶在表單中,所輸入的 ID 數據,存儲(set) 至 Model 實例層的對象
             model.Name = TextBox2.Text;    //將用戶在表單中,所輸入的 Name 數據,存儲(set) 至 Model 實例層的對象
             model.Price = TextBox3.Text;   //將用戶在表單中,所輸入的 Price 數據,存儲(set) 至 Model 實例層的對象

       
      bll.executeInsert(model); //將包裝好的用戶輸入數據的集合,傳遞至 BLL 商業邏輯層
      }
      }
      
      

       

      BLL 商業邏輯層
      namespace com.公司名稱.項目名稱.BLL
      {
      public class Product
      {
      //一個 DAL 數據訪問層的對象
      private com.公司名稱.項目名稱.DAL.Product dal = new com.公司名稱.項目名稱.DAL.Product();
       
              public int executeInsert(com.公司名稱.項目名稱.Model.Product model)
              {
                 
      //這里可以加入其他的商業邏輯


      //將包裝好的用戶輸入數據的集合,傳遞至 DAL 數據訪問層
      return dal.executeInsert(model);
      }
      }
      }

       

      DAL 數據訪問層
      namespace com.公司名稱.項目名稱.DAL
      {
      public class Product
      {
      public int executeInsert(com.公司名稱.項目名稱.Model.Product model)
      {
      StringBuilder strSql
      = new StringBuilder();
       
                  //在這里組合出完整的 SQL 語句
                  strSql.Append("INSERT INTO Product(ID, Name, Price) VALUES (@ID, @Name, @Price)"); 
       
                  //ADO.NET 中的 SqlParameterCollection 類的應用,表單中所有輸入數據的集合 
                  System.Data.SqlClient.SqlParameter[] params = {
                     
      new SqlParameter("@ID", SqlDbType.Int),
                     
      new SqlParameter("@Name", SqlDbType.NVarchar, 30),
                     
      new SqlParameter("@Price", SqlDbType.Decimal) };
                   
                  //在這將用戶在表單中輸入的多個數據,逐一填入 SQL 語句里的「參數(parameters)」
                  params[0].Value = model.ID;
                 
      params[1].Value = model.Name;
                 
      params[2].Value = model.Price;
      
      
                  //將組合好的整句 SQL 語句,透過共用的「DBUtility 數據庫訪問類」DbHelper,拋入數據庫去執行「添加」的動作 
                  com.公司名稱.項目名稱.DBUtility.DbHelper dbh;
                  int intResult = dbh.executeInsert(strSql.ToString(), params);
                              

      return intResult;
      }
      }
      }

       

      當然,若您只是單純要傳遞用戶在表單中輸入的多個值,并非一定要透過此種 Mapping 的 C# 類 instance,微軟 ADO.NET 提供的 SqlParameterCollection 類也很好用,且可事先設置好對應的數據表里,字段的類型和長度,如上方 DAL 數據訪問層里的代碼。

       

      若真正要談到 O/R Mapping 的議題,其特性及優點甚多,例如可避免在代碼中,直接寫死特定的數據表字段名稱,或避免在前端代碼中出現 SQL 語句,以利于中大型系統日后的維護。其內容非三言兩語可道盡,本文不再深入探討。


      posted on 2009-12-16 01:10  WizardWu  閱讀(13444)  評論(28)    收藏  舉報
      主站蜘蛛池模板: 国产人成精品一区二区三| 亚洲旡码欧美大片| 中国美女a级毛片| 四虎国产精品永久入口| av无码久久久久不卡网站蜜桃| 涩涩爱狼人亚洲一区在线| 亚洲国产欧美一区二区好看电影| 久久久久国产精品人妻| 亚洲线精品一区二区三八戒| 国产一区二区三区不卡视频| 国产一级小视频| 国产精品麻豆欧美日韩ww| 国产精成人品日日拍夜夜| 久久久无码一区二区三区| 欧美 亚洲 另类 丝袜 自拍 动漫| 一区二区三区四区五区黄色| 无码人妻一区二区三区线| 国产精品福利自产拍在线观看 | 日韩深夜福利视频在线观看| 久久人与动人物a级毛片| 无码国模国产在线观看免费| 旅游| 精品久久久久久国产| 一区二区三区国产不卡| 湖北省| 久久99精品国产麻豆婷婷| 亚洲国产日韩一区三区| 东港市| 国产精品国产三级国av| 色狠狠色婷婷丁香五月| A级毛片100部免费看| 人妻丝袜无码专区视频网站| 看免费真人视频网站| 亚洲人成人一区二区三区| 热久久99精品这里有精品| 2021国产成人精品久久| 久久91精品牛牛| 天堂网国产| 欧美日本在线一区二区三区| 成人午夜福利精品一区二区| 国产精品爽黄69天堂a|