.NET数据库编程求索之路--6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(1)

简介: 6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(1)    【 夏春涛 email: xchuntao@163.com  blog: http://www.cnblogs.

6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(1)

 

 【 夏春涛 email: xchuntao@163.com  blog: http://www.cnblogs.com/SummerRain

6.1 解决方案框架

解决方案(.sln)包含以下几个项目:

(1)类库项目HomeShop.DbUtility,数据访问实用工具;【同5】

(2)类库项目HomeShop.Model,实体层;【同5】

(3)类库项目HomeShop.DAL,数据访问层;

(4)类库项目HomeShop.BLL,业务逻辑层;【同5】

(5)WinForm项目HomeShop.WinForm,界面层。【同5】

 

 

6.2 数据访问层HomeShop.DAL

OrderDAO.cs

  1  using System;
  2  using System.Collections.Generic;
  3  using System.Linq;
  4  using System.Text;
  5  // 新添命名空间
  6  using System.Data;
  7  using System.Data.SqlClient;
  8  using HomeShop.DbUtility;
  9  using HomeShop.Model;
 10 
 11  namespace HomeShop.DAL
 12 {
 13      public  class OrderDAO 
 14     {
 15          protected SqlDbHelper dbHelper;
 16 
 17          public OrderDAO()
 18         {
 19              this.dbHelper =  new SqlDbHelper();
 20         }
 21 
 22          #region 添加
 23          public  int Add(Order order)
 24         {
 25              int rowsCountAffected =  0;
 26             SqlTransaction trans = dbHelper.BeginTransaction();
 27              try
 28             {
 29                  // 新增订单基本信息---------------------------------------------                
 30                   // @OrderID作为传出参数,用于获取新增订单的ID
 31                  SqlParameter paramOrderID =  new SqlParameter( " @OrderID ", SqlDbType.Int);
 32                 paramOrderID.Direction = ParameterDirection.Output;
 33                 SqlParameter[] parameters = {
 34                     paramOrderID,
 35                      new SqlParameter( " @OrderTime ", order.OrderTime),
 36                      new SqlParameter( " @OrderStateCode ", order.OrderStateCode),
 37                      new SqlParameter( " @CustomerName ", order.CustomerName),
 38                      new SqlParameter( " @CustomerPhoneNo ", order.CustomerPhoneNo),
 39                      new SqlParameter( " @CustomerAddress ", order.CustomerAddress)};
 40                 rowsCountAffected += dbHelper.ExecuteNonQueryTrans(trans,  " Order_Insert ", CommandType.StoredProcedure, parameters);
 41                 order.OrderID = ( int)paramOrderID.Value;
 42                  // -----------------------------------------------------------
 43                   // 循环添加订购商品信息
 44                   for ( int i =  0; i < order.OrderItemList.Count; i++)
 45                 {
 46                     SqlParameter paramOrderItemID =  new SqlParameter( " @OrderItemID ", SqlDbType.Int);
 47                     paramOrderItemID.Direction = ParameterDirection.Output;
 48                     SqlParameter[] parametersX = {
 49                         paramOrderItemID,
 50                          new SqlParameter( " @OrderID ", order.OrderID),
 51                          new SqlParameter( " @Product ", order.OrderItemList[i].Product),
 52                          new SqlParameter( " @UnitPrice ", order.OrderItemList[i].UnitPrice),
 53                          new SqlParameter( " @Quantity ", order.OrderItemList[i].Quantity)};
 54                     rowsCountAffected += dbHelper.ExecuteNonQueryTrans(trans,  " OrderItem_Insert ", CommandType.StoredProcedure, parametersX);
 55                 }
 56                 trans.Commit(); // 提交数据库事务
 57                  dbHelper.Close();
 58             }
 59              catch
 60             {
 61                 trans.Rollback(); // 回滚数据库事务
 62                  dbHelper.Close();
 63                  throw;
 64             }            
 65 
 66              return rowsCountAffected;
 67         }
 68          #endregion
 69 
 70          #region 修改
 71          public  int Update(Order order)
 72         {
 73              int rowsCountAffected =  0;        
 74 
 75             List<SqlCmdTextAndParams> listCmdTextAndParams =  new List<SqlCmdTextAndParams>();
 76              // 修改订单基本信息
 77              SqlParameter[] parameters = {
 78                          new SqlParameter( " @OrderTime ", order.OrderTime),
 79                          new SqlParameter( " @OrderStateCode ", order.OrderStateCode),
 80                          new SqlParameter( " @CustomerName ", order.CustomerName),
 81                          new SqlParameter( " @CustomerPhoneNo ", order.CustomerPhoneNo),
 82                          new SqlParameter( " @CustomerAddress ", order.CustomerAddress),
 83                          new SqlParameter( " @OrderID ", order.OrderID)};
 84             listCmdTextAndParams.Add( new SqlCmdTextAndParams( " Order_Update ", CommandType.StoredProcedure, parameters));
 85              // -----------------------------------------------------------
 86               // 循环将订购商品信息列表同步更新到数据库中
 87               // 删除
 88              Order originalOrder =  this.GetSingle(order.OrderID);
 89              for ( int i =  0; i < originalOrder.OrderItemList.Count; i++)
 90             {
 91                  bool exists = order.OrderItemList.Exists(
 92                      delegate(OrderItem item) {  return (item.OrderItemID == originalOrder.OrderItemList[i].OrderItemID); });
 93                  if (exists)  continue;
 94 
 95                 SqlParameter[] parametersX = {
 96                                  new SqlParameter( " @OrderItemID ", originalOrder.OrderItemList[i].OrderItemID)};
 97                 listCmdTextAndParams.Add( new SqlCmdTextAndParams( " OrderItem_Delete ", CommandType.StoredProcedure, parametersX));                
 98             }
 99              // 新增/修改
100              OrderItemDAO orderItemDAO =  new OrderItemDAO();
101              for ( int i =  0; i < order.OrderItemList.Count; i++)
102             {
103                  if ( 0 >= order.OrderItemList[i].OrderItemID) // 新增
104                  {
105                     SqlParameter paramOrderItemID =  new SqlParameter( " @OrderItemID ", SqlDbType.Int);
106                     paramOrderItemID.Direction = ParameterDirection.Output;
107                     SqlParameter[] parametersX = {
108                         paramOrderItemID,
109                          new SqlParameter( " @OrderID ", order.OrderID),
110                          new SqlParameter( " @Product ", order.OrderItemList[i].Product),
111                          new SqlParameter( " @UnitPrice ", order.OrderItemList[i].UnitPrice),
112                          new SqlParameter( " @Quantity ", order.OrderItemList[i].Quantity)};
113                     listCmdTextAndParams.Add( new SqlCmdTextAndParams( " OrderItem_Insert ", CommandType.StoredProcedure, parametersX));
114                 }
115                  else // 修改
116                  {
117                     SqlParameter[] parametersX = {
118                          new SqlParameter( " @OrderItemID ", order.OrderItemList[i].OrderItemID),
119                          new SqlParameter( " @OrderID ", order.OrderID),
120                          new SqlParameter( " @Product ", order.OrderItemList[i].Product),
121                          new SqlParameter( " @UnitPrice ", order.OrderItemList[i].UnitPrice),
122                          new SqlParameter( " @Quantity ", order.OrderItemList[i].Quantity)};                                    
123                     listCmdTextAndParams.Add( new SqlCmdTextAndParams( " OrderItem_Update ", CommandType.StoredProcedure, parametersX));
124                 }
125             }
126             rowsCountAffected = dbHelper.ExecuteNonQueryTrans(listCmdTextAndParams);
127              return rowsCountAffected;
128         }
129          #endregion
130 
131          // 删除
132           public  void Delete( int orderID)
133         {
134             SqlParameter parameter =  new SqlParameter( " @OrderID ",orderID);
135             dbHelper.ExecuteNonQuery( " Order_Delete ", CommandType.StoredProcedure, parameter);
136         }
137 
138          // 获取实体对象列表
139           public List<Order> GetList()
140         {
141              string predicate =  "";
142             DataTable table = GetTable(predicate);
143              return TableToList(table);
144         }
145         
146          // 获取实体对象列表
147           public List<Order> GetList( string customerName)
148         {            
149              string predicate =  "  [CustomerName] LIKE '% " + customerName +  " %' ";
150             DataTable table = GetTable(predicate);
151              return TableToList(table);
152         }
153 
154          // 获取单一实体对象
155           public Order GetSingle( int orderID)
156         {
157              string predicate =  "  [OrderID] =  " + orderID.ToString();
158             DataTable table = GetTable(predicate);
159             List<Order> list = TableToList(table);
160              if (list.Count ==  1)
161             {
162                  // return list[0];
163                  Order order = list[ 0];
164                  // ----子表----
165                  OrderItemDAO orderItemDAO =  new OrderItemDAO();
166                 order.OrderItemList = orderItemDAO.GetList(order.OrderID);
167                  return order;
168             }
169              else  if (list.Count ==  0)
170                  return  null;
171              else
172             {
173                 Exception ex =  new Exception( " 满足条件的实体多于1个。 ");
174                  throw ex;
175             }
176         }
177 
178          // 将DataTable转换为List
179           private List<Order> TableToList(DataTable table)
180         {
181             List<Order> list =  new List<Order>();
182              for ( int i =  0; i < table.Rows.Count; i++)
183             {
184                 list.Add(RowToModel(table.Rows[i]));
185             }
186              return list;
187         }
188 
189          // 获取DataTable
190           private DataTable GetTable( string predicate)
191         {
192             SqlParameter parameter =  new SqlParameter( " @predicate ", predicate);
193              return dbHelper.ExecuteQuery( " Order_Select ", CommandType.StoredProcedure, parameter);
194         }
195         
196          // 将DataRow转换为实体对象
197           private Order RowToModel(DataRow row)
198         {
199              // ----父表----
200              Order order =  new Order();
201             order.OrderID = ( int)row[ " OrderID "];
202             order.CustomerName = row[ " CustomerName "].ToString();
203             order.CustomerPhoneNo = row[ " CustomerPhoneNo "].ToString();
204             order.CustomerAddress = row[ " CustomerAddress "].ToString();
205             order.OrderTime = Convert.ToDateTime(row[ " OrderTime "]);
206             order.OrderStateCode = row[ " OrderStateCode "].ToString();
207             order.OrderStateName = row[ " OrderStateName "].ToString();
208              // ----子表----
209               // OrderItemDAO orderItemDAO = new OrderItemDAO();
210               // order.OrderItemList = orderItemDAO.GetList(order.OrderID);
211              
212              return order;
213         }
214 
215     }
216 }

 

OrderItemDAO.cs

 1  using System;
 2  using System.Collections.Generic;
 3  using System.Linq;
 4  using System.Text;
 5  // 新添命名空间
 6  using System.Data;
 7  using System.Data.SqlClient;
 8  using HomeShop.DbUtility;
 9  using HomeShop.Model;
10 
11  namespace HomeShop.DAL
12 {
13      public  class OrderItemDAO
14     {
15          private SqlDbHelper dbHelper;
16 
17          public OrderItemDAO()
18         { 
19              this.dbHelper  =  new SqlDbHelper();
20         }
21 
22          // 获取实体对象列表
23           public List<OrderItem> GetList( int orderID)
24         {
25             DataTable table = GetTable(orderID);
26              return TableToList(table);
27         }
28 
29          // 将DataTable转换为List
30           private List<OrderItem> TableToList(DataTable table)
31         {
32             List<OrderItem> list =  new List<OrderItem>();
33              for ( int i =  0; i < table.Rows.Count; i++)
34             {
35                 list.Add(RowToModel(table.Rows[i]));
36             }
37              return list;
38         }
39 
40          // 获取DataTable
41           private DataTable GetTable( int orderID)
42         {
43             SqlParameter parameter =  new SqlParameter( " @OrderID ", orderID);
44              return dbHelper.ExecuteQuery( " OrderItem_Select ", CommandType.StoredProcedure, parameter);
45         }
46 
47          // 将DataRow转换为实体对象
48           private OrderItem RowToModel(DataRow row)
49         {
50             OrderItem orderItem =  new OrderItem();
51             orderItem.OrderID = ( int)row[ " OrderID "];
52             orderItem.OrderItemID = ( int)row[ " OrderItemID "];
53             orderItem.Product = row[ " Product "].ToString();
54             orderItem.Quantity = ( int)row[ " Quantity "];
55             orderItem.UnitPrice = ( decimal)row[ " UnitPrice "];
56 
57              return orderItem;
58         }
59     }
60 }

 

OrderStateDAO.cs

 1  using System;
 2  using System.Collections.Generic;
 3  using System.Linq;
 4  using System.Text;
 5  // 新添命名空间
 6  using System.Data;
 7  using System.Data.SqlClient;
 8  using HomeShop.DbUtility;
 9  using HomeShop.Model;
10 
11  namespace HomeShop.DAL
12 {
13      public  class OrderStateDAO
14     {
15          private SqlDbHelper dbHelper;
16 
17          public OrderStateDAO()
18         { 
19              this.dbHelper  =  new SqlDbHelper();
20         }
21 
22          // 获取实体对象列表
23           public List<OrderState> GetList()
24         {
25             DataTable table = GetTable();
26              return TableToList(table);
27         }
28 
29          // 将DataTable转换为List
30           private List<OrderState> TableToList(DataTable table)
31         {
32             List<OrderState> list =  new List<OrderState>();
33              for ( int i =  0; i < table.Rows.Count; i++)
34             {
35                 list.Add(RowToModel(table.Rows[i]));
36             }
37              return list;
38         }
39 
40          // 获取DataTable
41           private DataTable GetTable()
42         {
43              return dbHelper.ExecuteQuery( " OrderState_Select ", CommandType.StoredProcedure,  null);
44         }
45 
46          // 将DataRow转换为实体对象
47           private OrderState RowToModel(DataRow row)
48         {
49             OrderState orderState =  new OrderState();
50             orderState.Code = row[ " Code "].ToString();
51             orderState.Name = row[ " Name "].ToString();
52              return orderState;
53         }
54     }
55 }

 

 

数据库文件:/Files/SummerRain/NetDbDevRoad/HomeShopDB.rar

完整源代码:/Files/SummerRain/NetDbDevRoad/6使用ADONET实现三层架构ListSP.rar

 

 

 

目录
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
存储 关系型数据库 数据库
高性能云盘:一文解析RDS数据库存储架构升级
性能、成本、弹性,是客户实际使用数据库过程中关注的三个重要方面。RDS业界率先推出的高性能云盘(原通用云盘),是PaaS层和IaaS层的深度融合的技术最佳实践,通过使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。
|
存储 Cloud Native 关系型数据库
PolarDB开源:云原生数据库的架构革命
本文围绕开源核心价值、社区运营实践和技术演进路线展开。首先解读存算分离架构的三大突破,包括基于RDMA的分布式存储、计算节点扩展及存储池扩容机制,并强调与MySQL的高兼容性。其次分享阿里巴巴开源治理模式,涵盖技术决策、版本发布和贡献者成长体系,同时展示企业应用案例。最后展望技术路线图,如3.0版本的多写多读架构、智能调优引擎等特性,以及开发者生态建设举措,推荐使用PolarDB-Operator实现高效部署。
589 4
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
551 16
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
907 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
467 19
|
存储 SQL 并行计算
【赵渝强老师】达梦数据库MPP集群的架构
达梦数据库提供大规模并行处理(MPP)架构,以低成本实现高性能并行计算,满足海量数据存储和复杂查询需求。DM MPP采用完全对等无共享体系,消除主节点瓶颈,通过多节点并行执行提升性能。其执行流程包括主EP生成计划、分发任务、各EP并行处理及结果汇总返回。为确保高可用性,建议结合数据守护部署。
640 0

热门文章

最新文章