日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
兩天完成一個小型工程報價系統(tǒng)(三層架構(gòu))

花了兩天,整理了一下三層架構(gòu),順便練了一個小型三層架構(gòu)——工程報價系統(tǒng)。

10年積累的網(wǎng)站設(shè)計制作、成都做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計制作后付款的網(wǎng)站建設(shè)流程,更有鳳慶免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

功能很簡單,完成基本的增刪改查

  • 搭建項目三層結(jié)構(gòu)
  • 界面的設(shè)計以及美化

#p#

  • 分層代碼的設(shè)計與實現(xiàn)

1.模型層:由于表設(shè)計時存在主外鍵關(guān)系,故把表映射成對象時添加一個外鍵對象來保存外鍵那張表的相關(guān)數(shù)據(jù)。

 
 
 
 
  1. // 外鍵實體
  2.             private Product _product;
  3.             private Project _project;
  4.             public Project _Project
  5.             {
  6.                 get { return _project; }
  7.                 set { _project = value; }
  8.             }
  9.             public Product _Product
  10.             {
  11.                 get { return _product; }
  12.                 set { _product = value; }
  13.             }

2.數(shù)據(jù)訪問層:把數(shù)據(jù)封裝成Model對象的各層之間傳遞。

我個人不喜歡三層之間傳遞DataSet數(shù)據(jù)集,我的理解是盡量不在BLL層出現(xiàn)DataSet,所以我在DAL層把所有獲取的數(shù)據(jù)封裝成IEnumerable集合,然后返回。

 
 
 
 
  1. protected IEnumerable ToModelsByFK(SqlDataReader reader)
  2.          {
  3.              var list = new List();
  4.              while (reader.Read())
  5.              {
  6.                  list.Add(ToModelByFK(reader));
  7.              }
  8.              return list;
  9.          }
 
 
 
 
  1. public ProjectItem ToModelByFK(SqlDataReader reader)
  2.          {
  3.              ProjectItem projectItem = new ProjectItem();
  4.              projectItem._Product = new Product();
  5.              projectItem._Project = new Project();
  6.              projectItem.ID = (int)ToModelValue(reader, "ID");
  7.              projectItem._Product.ID = (int)ToModelValue(reader, "ProductID");
  8.              projectItem._Project.ID = (int)ToModelValue(reader,"projectID");
  9.              projectItem._Product.Manufacturer = ToModelValue(reader, "Manufacturer").ToString();
  10.              projectItem._Product.Parameters = ToModelValue(reader, "Parameters").ToString();
  11.              projectItem._Product.Price = decimal.Parse( ToModelValue(reader, "Price").ToString());
  12.              projectItem._Product.ProductName = ToModelValue(reader, "ProductName").ToString();
  13.              projectItem._Product.Specification = ToModelValue(reader, "Specification").ToString();
  14.              projectItem._Product.Unit = ToModelValue(reader, "Unit").ToString();
  15.              projectItem.Count = (int)ToModelValue(reader, "Count");
  16.              projectItem.TotalMoney = (decimal)ToModelValue(reader, "TotalMoney");
  17.              projectItem.UnitPrice = (decimal)ToModelValue(reader, "UnitPrice"); 
  18.              return projectItem;
  19.          }
 
 
 
 
  1. protected object ToModelValue(SqlDataReader reader,string columnName)
  2.         {
  3.             if(reader.IsDBNull(reader.GetOrdinal(columnName)))
  4.             {
  5.                 return null;
  6.             }
  7.             else
  8.             {
  9.                 return reader[columnName];
  10.             }
  11.         }

使用GetProjectByCondition方法返回一個封裝成對象的 IEnumerable集合

 
 
 
 
  1. public IEnumerable GetProjectByCondition(string projectName, string customerName, string contract, string tel)
  2.         {
  3.             StringBuilder sqlWhere = new StringBuilder("select * from Project where 1=1");
  4.             List listParameters = new List();
  5.             if (!string.IsNullOrWhiteSpace(projectName))
  6.             {
  7.                 sqlWhere.AppendLine(" and projectName like @projectName");
  8.                 listParameters.Add(new SqlParameter("projectName", "%" + projectName + "%"));
  9.             }
  10.             if (!string.IsNullOrWhiteSpace(contract))
  11.             {
  12.                 sqlWhere.AppendLine(" and Contact like @Contact");
  13.                 listParameters.Add(new SqlParameter("Contact", "%" + contract + "%"));
  14.             }
  15.             if (!string.IsNullOrWhiteSpace(customerName))
  16.             {
  17.                 sqlWhere.AppendLine(" and customer like @customer");
  18.                 listParameters.Add(new SqlParameter("customer", "%" + customerName + "%"));
  19.             }
  20.             if (!string.IsNullOrWhiteSpace(tel))
  21.             {
  22.                 sqlWhere.AppendLine(" and tel like @tel");
  23.                 listParameters.Add(new SqlParameter("tel", "%" + tel + "%"));
  24.             }
  25.             using (SqlDataReader reader = SqlHelper.ExecuteDataReader(sqlWhere.ToString(), listParameters.ToArray()))
  26.             {
  27.                 return ToModels(reader);
  28.             }
  29.         }

UpdatePassChecked方法接受一個對象,通過對象的屬性來獲取數(shù)據(jù)

 
 
 
 
  1. public int UpdatePassChecked(ProjectItem projectItem)
  2.          {
  3.              string sql =
  4.                  "UPDATE Project " +
  5.                  "SET " +
  6.              " ProjectName = @ProjectName"
  7.                  + ", Customer = @Customer"
  8.                  + ", Contact = @Contact"
  9.                  + ", Tel = @Tel"
  10.                  + ", DeliveryPlace = @DeliveryPlace"
  11.                  + ", DeliveryTime = @DeliveryTime"
  12.                  + ", TransportCosts = @TransportCosts"
  13.                  + ", PaymentTerm = @PaymentTerm"
  14.                  + ", Bak = @Bak"
  15.              + " WHERE ID = @ID";
  16.              SqlParameter[] para = new SqlParameter[]
  17.             {
  18.                 new SqlParameter("@ID", projectItem._Project.ID)
  19.                     ,new SqlParameter("@ProjectName", ToDBValue(projectItem._Project.ProjectName))
  20.                     ,new SqlParameter("@Customer", ToDBValue(projectItem._Project.Customer))
  21.                     ,new SqlParameter("@Contact", ToDBValue(projectItem._Project.Contact))
  22.                     ,new SqlParameter("@Tel", ToDBValue(projectItem._Project.Tel))
  23.                     ,new SqlParameter("@DeliveryPlace", ToDBValue(projectItem._Project.DeliveryPlace))
  24.                     ,new SqlParameter("@DeliveryTime", ToDBValue(projectItem._Project.DeliveryTime))
  25.                     ,new SqlParameter("@TransportCosts", ToDBValue(projectItem._Project.TransportCosts))
  26.                     ,new SqlParameter("@PaymentTerm", ToDBValue(projectItem._Project.PaymentTerm))
  27.                     ,new SqlParameter("@Bak", ToDBValue(projectItem._Project.Bak))
  28.             };
  29.              return SqlHelper.ExecuteNonQuery(sql, para);
  30.          }

Add方法傳入一個已經(jīng)把數(shù)據(jù)封裝好的對象,然后返回一個新的對象(包含新創(chuàng)建生成的ID)

 
 
 
 
  1. public Product Add(Product product)
  2.         {
  3.                 string sql ="INSERT INTO Product (ProductName, Specification, Manufacturer, Parameters, Price, Unit)  output inserted.ID VALUES (@ProductName, @Specification, @Manufacturer, @Parameters, @Price, @Unit)";
  4.                 SqlParameter[] para = new SqlParameter[]
  5.                     {
  6.                         new SqlParameter("@ProductName", ToDBValue(product.ProductName)),
  7.                         new SqlParameter("@Specification", ToDBValue(product.Specification)),
  8.                         new SqlParameter("@Manufacturer", ToDBValue(product.Manufacturer)),
  9.                         new SqlParameter("@Parameters", ToDBValue(product.Parameters)),
  10.                         new SqlParameter("@Price", ToDBValue(product.Price)),
  11.                         new SqlParameter("@Unit", ToDBValue(product.Unit)),
  12.                     };
  13.                     
  14.                 int newId = (int)SqlHelper.ExecuteScalar(sql, para);
  15.                 return GetByID(newId);
  16.         }

#p#

3.業(yè)務(wù)邏輯層:業(yè)務(wù)邏輯層是項目的核心,業(yè)務(wù)邏輯上的代碼通常在這兒實現(xiàn)(一言難盡)。

簡單數(shù)據(jù)驗證:

 
 
 
 
  1. public bool UpdateThroughChecked(ProjectItem projectItem)
  2.         {
  3.             if (string.IsNullOrEmpty(projectItem._Project.ProjectName))
  4.             {
  5.                 throw new Exception("項目名稱不能為空");
  6.             }
  7.             //顧客姓名可以為空,但聯(lián)系人不能為空,所以數(shù)據(jù)庫里就應(yīng)該設(shè)計好
  8.             if (string.IsNullOrEmpty(projectItem._Project.Contact))
  9.             {
  10.                 throw new Exception("聯(lián)系人姓名不能為空");
  11.             }
  12.             if (string.IsNullOrEmpty(projectItem._Project.Tel))
  13.             {
  14.                 throw new Exception("聯(lián)系電話不能為空");
  15.             }
  16.             if (string.IsNullOrEmpty(projectItem._Project.DeliveryPlace))
  17.             {
  18.                 throw new Exception("交貨地點不能為空");
  19.             }
  20.             if (string.IsNullOrEmpty(projectItem._Project.DeliveryTime))
  21.             {
  22.                 throw new Exception("交貨時間不能為空");
  23.             }
  24.             if (projectItem._Project.TransportCosts<00)
  25.             {
  26.                 throw new Exception("運輸費用不能為負數(shù)");
  27.             }
  28.             return new DAL.ProjectItemService().UpdatePassChecked(projectItem) > 0;
  29.         }

計算總金額:

 
 
 
 
  1. public decimal GetProductTotalMoney(int projectID)
  2.         {
  3.             var list = new DAL.ProjectItemService().GetProductTotalMoney(projectID);
  4.             decimal  totalMoney = 0.00M;
  5.             foreach (var model in list)
  6.             {
  7.                 totalMoney+=model.TotalMoney.Value;
  8.             }
  9.             return totalMoney;
  10.         }

根據(jù)查詢條件獲取數(shù)據(jù)集合:

 
 
 
 
  1. /// 
  2.         /// 根據(jù)查詢條件獲取數(shù)據(jù)集合
  3.         /// 
  4.         /// 
  5.         /// 
  6.         public IEnumerable GetProductsByCondition(string condition)
  7.         {
  8.            return new DAL.ProductService().GetProductsByCondition(condition);
  9.        
  10.         }

根據(jù)ProjectItemID獲取一條記錄(封裝成對象)

 
 
 
 
  1. public Model.ProjectItem GetOneProjectItemByID(int ProjectItemID)
  2.         {
  3.             return new DAL.ProjectItemService().GetOneProjectItemByID(ProjectItemID);
  4.         }

增加一條記錄:

 
 
 
 
  1. /// 
  2.         /// 新增一條記錄 根據(jù)條件
  3.         /// 
  4.         /// 
  5.         /// 
  6.         public Model.Project AddPassCheckd(Model.Project modelProject)
  7.         {
  8.             if (string.IsNullOrEmpty(modelProject.ProjectName))
  9.             {
  10.                 throw new Exception("項目名稱不能為空");
  11.             }
  12.             if (string.IsNullOrEmpty(modelProject.Customer))
  13.             {
  14.                 throw new Exception("顧客名稱不能為空");
  15.             }
  16.             if (string.IsNullOrEmpty(modelProject.Tel))
  17.             {
  18.                 throw new Exception("聯(lián)系電話不能為空");
  19.             }
  20.             if (modelProject.TransportCosts <= 0)
  21.             {
  22.                 throw new Exception("運輸費用不能為負數(shù):(");
  23.             }
  24.             return new DAL.ProjectService().Add(modelProject);
  25.            
  26.         }

刪除一個項目:

 
 
 
 
  1. /// 
  2.         /// 刪除一個項目
  3.         /// 
  4.         /// 
  5.         /// 
  6.         public bool DeleteProject(int projectID)
  7.         {
  8.              bool isSucceed=  new BLL.ProjectItemManager().DeleteProjectItemsByProjectID(projectID);
  9.              isSucceed = new DAL.ProjectService().DeleteByID(projectID) > 0 && isSucceed;
  10.              return isSucceed;
  11.         }

4.表現(xiàn)層(UI)

簡單的窗體里嵌套窗體:

 
 
 
 
  1. public void LoadProjectListForm()
  2.         {
  3.             projectListForm = null;
  4.             if (projectListForm==null)
  5.             {
  6.                 projectListForm = new ProjectListForm();
  7.             }
  8.             //去掉邊框
  9.             projectListForm.FormBorderStyle = FormBorderStyle.None;
  10.             projectListForm.TopLevel = false;//窗體是否是頂級窗體
  11.             projectListForm.Dock = DockStyle.Fill;//填充
  12.             projectListForm.Show();//不寫看不到
  13.             panelContainer.Controls.Clear();//清空
  14.             panelContainer.Controls.Add(projectListForm);
  15.         }

綁定數(shù)據(jù):

 我原先思路是直接在DataGridView里綁定對象的屬性,和GridView一樣使用,但一直無法綁上去,哪兒錯了?

 所以只能曲線救國了:

     
     
     
     
  1. void LoadData()
  2.         {
  3.             var list = new BLL.ProjectItemManager().GetAllProducts(projectID);
  4.             //dataGridViewProjectItems.DataSource = list;//當控件被綁定時無法向其添加Row
  5.             dataGridViewProjectItems.Rows.Clear();
  6.             foreach (var model in list)
  7.             {
  8.                 int i = dataGridViewProjectItems.Rows.Add();
  9.                 dataGridViewProjectItems.Rows[i].Cells["idColumn"].Value = model.ID;
  10.                 dataGridViewProjectItems.Rows[i].Cells["specificationColumn"].Value = model._Product.Specification;
  11.                 dataGridViewProjectItems.Rows[i].Cells["productNameColumn"].Value = model._Product.ProductName;
  12.                 dataGridViewProjectItems.Rows[i].Cells["manufacturerColumn"].Value = model._Product.Manufacturer;
  13.                 dataGridViewProjectItems.Rows[i].Cells["parametersColumn"].Value = model._Product.Parameters;
  14.                 dataGridViewProjectItems.Rows[i].Cells["productIDColumn"].Value = model._Product.ID;
  15.                 dataGridViewProjectItems.Rows[i].Cells["totalMoneyColumn"].Value = model.TotalMoney;
  16.                 dataGridViewProjectItems.Rows[i].Cells["countColumn"].Value = model.Count;
  17.                 dataGridViewProjectItems.Rows[i].Cells["unitPriceColumn"].Value = model.UnitPrice;
  18.                 dataGridViewProjectItems.Rows[i].Cells["projectIDColumn"].Value = model._Project.ID;
  19.             }

5.項目總結(jié)

花了一個周末修修補補完成了這個工程報價系統(tǒng),算是復(fù)習(xí)了一把三層架構(gòu)。

如果有需要這個項目的朋友可以留下郵箱,我發(fā)給你,不算很專業(yè),湊合著參考下~~

沒想到這么多朋友要我的源碼,我很感動。附件我就不傳了,我也怕誤導(dǎo)新人。有需要的朋友可以留下郵箱,大家一起探討,我的代碼純當入門階段,是我個人對三層架構(gòu)的理解,不足之處,也請多多包涵,提個意見,希望與君互勉。想要更深刻探索我推介《ASP.NET 設(shè)計模式》

本文標題:兩天完成一個小型工程報價系統(tǒng)(三層架構(gòu))
鏈接URL:http://www.dlmjj.cn/article/djegjcc.html