.NET数据库编程求索之路--5.使用ADO.NET实现(三层架构篇-使用List传递数据)(1)-阿里云开发者社区

开发者社区> 夏春涛> 正文

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

简介: 5.使用ADO.NET实现(三层架构篇-使用List传递数据)(1)   5.1 解决方案框架 解决方案(.sln)包含以下几个项目: (1)类库项目HomeShop.DbUtility,数据访问实用工具;【同4.2】 (2)类库项目HomeShop.Model,实体层;【同4.3】 (3)类库项目HomeShop.DAL,数据访问层; (4)类库项目HomeShop.BLL,业务逻辑层; (5)WinForm项目HomeShop.WinForm,界面层。
+关注继续查看

 

5.使用ADO.NET实现(三层架构篇-使用List传递数据)(1)

 

5.1 解决方案框架

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

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

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

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

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

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

 

5.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         public OrderDAO(string connectionString)
 23         {
 24             this.dbHelper = new SqlDbHelper(connectionString);
 25         }
 26 
 27         //添加
 28         public int Add(Order order)
 29         {
 30             int rowsCountAffected = 0;
 31             SqlTransaction trans = dbHelper.BeginTransaction();
 32             try
 33             {
 34                 //新增订单基本信息,并使用SQL的系统函数@@IDENTITY获取新增订单的ID
 35                 string sql = @"INSERT INTO [Order]([OrderTime],
 36                                                    [OrderStateCode],
 37                                                    [CustomerName],
 38                                                    [CustomerPhoneNo],
 39                                                    [CustomerAddress])
 40                                VALUES(@OrderTime,
 41                                       @OrderStateCode,
 42                                       @CustomerName,
 43                                       @CustomerPhoneNo,
 44                                       @CustomerAddress)
 45                                SET @OrderID = @@IDENTITY ";
 46                 //@OrderID作为传出参数,用于获取新增订单的ID
 47                 SqlParameter paramOrderID = new SqlParameter("@OrderID", SqlDbType.Int);
 48                 paramOrderID.Direction = ParameterDirection.Output;
 49                 SqlParameter[] parameters = {
 50                     new SqlParameter("@OrderTime", order.OrderTime),
 51                     new SqlParameter("@OrderStateCode", order.OrderStateCode),
 52                     new SqlParameter("@CustomerName", order.CustomerName),
 53                     new SqlParameter("@CustomerPhoneNo", order.CustomerPhoneNo),
 54                     new SqlParameter("@CustomerAddress", order.CustomerAddress),
 55                     paramOrderID};
 56                 rowsCountAffected += dbHelper.ExecuteNonQueryTrans(trans, sql, parameters);
 57                 order.OrderID = (int)paramOrderID.Value;
 58                 //-----------------------------------------------------------
 59                 //循环添加订购商品信息
 60                 for (int i = 0; i < order.OrderItems.Count; i++)
 61                 {
 62                     string sqlX = @"INSERT INTO [OrderItem]([OrderID],
 63                                                 [Product],
 64                                                 [UnitPrice],
 65                                                 [Quantity])
 66                                     VALUES( @OrderID,
 67                                             @Product,
 68                                             @UnitPrice,
 69                                             @Quantity)";
 70                     SqlParameter[] parametersX = {
 71                         new SqlParameter("@OrderID", order.OrderID),
 72                         new SqlParameter("@Product", order.OrderItems[i].Product),
 73                         new SqlParameter("@UnitPrice", order.OrderItems[i].UnitPrice),
 74                         new SqlParameter("@Quantity", order.OrderItems[i].Quantity)};
 75                     rowsCountAffected += dbHelper.ExecuteNonQueryTrans(trans, sqlX, parametersX);
 76                 }
 77                 trans.Commit();//提交数据库事务
 78             }
 79             catch
 80             {
 81                 trans.Rollback();//回滚数据库事务
 82                 throw;
 83             }
 84             dbHelper.Close();
 85 
 86             return rowsCountAffected;
 87         }
 88 
 89         //修改
 90         public int Update(Order order)
 91         {
 92             int rowsCountAffected = 0;            
 93 
 94             List<SqlCmdTextAndParams> listCmdTextAndParams = new List<SqlCmdTextAndParams>();
 95             //修改订单基本信息
 96             string sql = @" UPDATE [Order]
 97                             SET [OrderTime] = @OrderTime,
 98                                 [OrderStateCode] = @OrderStateCode,
 99                                 [CustomerName] = @CustomerName,
100                                 [CustomerPhoneNo] = @CustomerPhoneNo,
101                                 [CustomerAddress] = @CustomerAddress
102                             WHERE [OrderID] = @OrderID";
103             SqlParameter[] parameters = {
104                         new SqlParameter("@OrderTime", order.OrderTime),
105                         new SqlParameter("@OrderStateCode", order.OrderStateCode),
106                         new SqlParameter("@CustomerName", order.CustomerName),
107                         new SqlParameter("@CustomerPhoneNo", order.CustomerPhoneNo),
108                         new SqlParameter("@CustomerAddress", order.CustomerAddress),
109                         new SqlParameter("@OrderID", order.OrderID)};
110             listCmdTextAndParams.Add(new SqlCmdTextAndParams(sql, parameters));
111             //-----------------------------------------------------------
112             //循环将订购商品信息列表同步更新到数据库中
113             //删除
114             string predicate = " OrderID = @OrderID ";
115             SqlParameter param = new SqlParameter("@OrderID",order.OrderID);
116             Order originalOrder = this.GetSingle(predicate, param);
117             for(int i=0;i<originalOrder.OrderItems.Count;i++)
118             {
119                 bool exists = order.OrderItems.Exists(
120                     delegate(OrderItem item){ return (item.OrderItemID == originalOrder.OrderItems[i].OrderItemID);});
121                 if (exists) continue;
122                 
123                 string sqlX = @"DELETE FROM [OrderItem]
124                                 WHERE [OrderItemID] = @OrderItemID";
125                 SqlParameter[] parametersX = {
126                                 new SqlParameter("@OrderItemID", originalOrder.OrderItems[i].OrderItemID)};
127                 listCmdTextAndParams.Add(new SqlCmdTextAndParams(sqlX, parametersX));                
128             }
129             //新增/修改
130             OrderItemDAO orderItemDAO = new OrderItemDAO();
131             for (int i = 0; i < order.OrderItems.Count; i++)
132             {
133                 if (0 >= order.OrderItems[i].OrderItemID )//新增
134                 {
135                     string sqlX = @"INSERT INTO [OrderItem]([OrderID],
136                                                             [Product],
137                                                             [UnitPrice],
138                                                             [Quantity])
139                                     VALUES( @OrderID,
140                                             @Product,
141                                             @UnitPrice,
142                                             @Quantity)";
143                     SqlParameter[] parametersX = {
144                                     new SqlParameter("@OrderID", order.OrderID),
145                                     new SqlParameter("@Product", order.OrderItems[i].Product),
146                                     new SqlParameter("@UnitPrice", order.OrderItems[i].UnitPrice),
147                                     new SqlParameter("@Quantity", order.OrderItems[i].Quantity)};
148                     listCmdTextAndParams.Add(new SqlCmdTextAndParams(sqlX, parametersX));
149                 }
150                 else//修改
151                 {
152                     string sqlX = @"UPDATE [OrderItem]
153                                                 SET [OrderID] = @OrderID,
154                                                     [Product] = @Product,
155                                                     [UnitPrice] = @UnitPrice,
156                                                     [Quantity] = @Quantity
157                                                 WHERE [OrderItemID] = @OrderItemID";
158                     SqlParameter[] parametersX = {
159                                     new SqlParameter("@OrderID", order.OrderID),
160                                     new SqlParameter("@Product", order.OrderItems[i].Product),
161                                     new SqlParameter("@UnitPrice", order.OrderItems[i].UnitPrice),
162                                     new SqlParameter("@Quantity", order.OrderItems[i].Quantity),
163                                     new SqlParameter("@OrderItemID", order.OrderItems[i].OrderItemID)};
164                     listCmdTextAndParams.Add(new SqlCmdTextAndParams(sqlX, parametersX));
165                 }
166             }
167             rowsCountAffected = dbHelper.ExecuteNonQueryTrans(listCmdTextAndParams);
168             return rowsCountAffected;
169         }
170         
171         //删除
172         public int Delete(Order order)
173         {
174             string sql = @"DELETE FROM [OrderItem]
175                            WHERE [OrderID] = @OrderID
176                            
177                            DELETE FROM [Order]
178                            WHERE [OrderID] = @OrderID ";
179             return dbHelper.ExecuteNonQueryTrans(sql, new SqlParameter("@OrderID", order.OrderID));
180         }
181         
182         //获取实体对象列表
183         public List<Order> GetList(string predicate, params SqlParameter[] parameters)
184         {
185             List<Order> list = new List<Order>();
186             DataTable table = GetTable(predicate, parameters);
187             for (int i = 0; i < table.Rows.Count; i++)
188             {
189                 list.Add(RowToModel(table.Rows[i]));
190             }
191             return list;
192         }
193 
194         //获取单一实体对象
195         public Order GetSingle(string predicate, params SqlParameter[] parameters)
196         {
197             List<Order> list = GetList(predicate, parameters);
198             if (list.Count == 1)
199                 return list[0];
200             else if (list.Count == 0)
201                 return null;
202             else
203             {
204                 Exception ex = new Exception("满足条件的实体多于1个。");
205                 throw ex;
206             }
207         }
208 
209         //获取DataTable
210         private DataTable GetTable(string predicate, params SqlParameter[] parameters)
211         {
212             string sql = @"SELECT [OrderID],
213                                   [CustomerName],
214                                   [CustomerPhoneNo],
215                                   [CustomerAddress],
216                                   [OrderTime],
217                                   [OrderStateCode],
218                                   [OrderState].[Name] AS [OrderState]
219                             FROM [Order]
220                             LEFT OUTER JOIN [OrderState]
221                             ON [Order].[OrderStateCode] = [OrderState].[Code]";
222             if (null != predicate && "" != predicate.Trim())
223             {
224                 sql += "  WHERE  " + predicate;
225             }
226             sql += " ORDER BY [OrderID] DESC ";
227             return dbHelper.ExecuteQuery(sql, parameters);
228         }
229         
230         //将DataRow转换为实体对象
231         private Order RowToModel(DataRow row)
232         {
233             //----父表----
234             Order order = new Order();
235             order.OrderID = (int)row["OrderID"];
236             order.CustomerName = row["CustomerName"].ToString();
237             order.CustomerPhoneNo = row["CustomerPhoneNo"].ToString();
238             order.CustomerAddress = row["CustomerAddress"].ToString();
239             order.OrderTime = Convert.ToDateTime(row["OrderTime"]);
240             order.OrderStateCode = row["OrderStateCode"].ToString();
241             //----子表----
242             OrderItemDAO orderItemDAO = new OrderItemDAO();
243             order.OrderItems = orderItemDAO.GetList("OrderID = @OrderID",
244                                                     new SqlParameter("@OrderID", order.OrderID));
245             
246             return order;
247         }
248 
249     }
250 }

 

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         public OrderItemDAO(string connectionString)
23         {
24             this.dbHelper = new SqlDbHelper(connectionString);
25         }
26 
27         //获取实体对象列表
28         public List<OrderItem> GetList(string predicate, params SqlParameter[] parameters)
29         {
30             List<OrderItem> list = new List<OrderItem>();
31             DataTable dataTable = GetTable(predicate, parameters);
32             for (int i = 0; i < dataTable.Rows.Count; i++)
33             {
34                 list.Add(RowToModel(dataTable.Rows[i]));
35             }
36 
37             return list;
38         }
39 
40         //获取DataTable
41         private DataTable GetTable(string predicate, params SqlParameter[] parameters)
42         {
43             string sql = @"SELECT [OrderItemID],
44                                   [OrderID],
45                                   [Product],
46                                   [UnitPrice],
47                                   [Quantity],
48                                   [UnitPrice]*[Quantity] AS SubTotal
49                            FROM [OrderItem]";
50             if (null != predicate && "" != predicate.Trim())
51             {
52                 sql += "  WHERE  " + predicate;
53             }
54             return dbHelper.ExecuteQuery(sql, parameters);
55         }
56 
57         //将DataRow转换为实体对象
58         private OrderItem RowToModel(DataRow row)
59         {
60             OrderItem orderItem = new OrderItem();
61             orderItem.OrderID = (int)row["OrderID"];
62             orderItem.OrderItemID = (int)row["OrderItemID"];
63             orderItem.Product = row["Product"].ToString();
64             orderItem.Quantity = (int)row["Quantity"];
65             orderItem.UnitPrice = (decimal)row["UnitPrice"];
66 
67             return orderItem;
68         }
69     }
70 }

 

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         public OrderStateDAO(string connectionString)
23         {
24             this.dbHelper = new SqlDbHelper(connectionString);
25         }
26 
27         //获取实体对象列表
28         public List<OrderState> GetList(string predicate, params SqlParameter[] parameters)
29         {
30             List<OrderState> list = new List<OrderState>();
31             DataTable dataTable = GetTable(predicate, parameters);
32             for (int i = 0; i < dataTable.Rows.Count; i++)
33             {
34                 list.Add(RowToModel(dataTable.Rows[i]));
35             }
36 
37             return list;
38         }
39 
40         //获取DataTable
41         private DataTable GetTable(string predicate, params SqlParameter[] parameters)
42         {
43             string sql = @"SELECT * FROM [OrderState]";
44             if (null != predicate && "" != predicate.Trim())
45             {
46                 sql += "  WHERE  " + predicate;
47             }
48             sql += " ORDER BY [Code] ";
49             return dbHelper.ExecuteQuery(sql, parameters);
50         }
51 
52         //将DataRow转换为实体对象
53         private OrderState RowToModel(DataRow row)
54         {
55             OrderState orderState = new OrderState();
56             orderState.Code = row["Code"].ToString();
57             orderState.Name = row["Name"].ToString();
58             return orderState;
59         }
60     }
61 }

 

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

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

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
微软称Google Android可以使用.NET,徐汇区网站设计
最近Oracle起诉Google使用Java侵权的事件炒得沸沸扬扬,但微软开源技术中心总监Tom Hanraha说,微软不会禁止Google Android使用.NET 技术。Hanraha说:“像Oracle因Java而起诉Google这样的事情,微软是不会做的。
805 0
“.NET技术”使用WCF实现SOA面向服务编程—— 架构设计
  SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就是一种进行系统开发的新的体系架构,在基于SOA架构的系统中,具体应用程序的功能是由 一些松耦合并且具有统一接口定义方式的组件(也就是service)组合构建起来的。
718 0
.NET数据库编程求索之路--10.使用EF实现(划分输入验证层)
10.使用EF实现(划分输入验证层) 注:使用partial类来实现输入验证逻辑的分层。   源码下载: /Files/SummerRain/NetDbDevRoad/a使用EF实现4划分输入验证层.
576 0
Asp.net MVC 使用Autofac的简单使用 IOC
Ioc(Inversion of Control)或者叫依赖注入DI(Dependency Injection) 如果一个接口有两个实现类,但是在实现过程中,用到了这两个具体的实现类。 如果采用IOC,则只能是注册一个接口类型,那么如何确保IOC在合适的时候传入不同类的实例?这是我突然间想到的一个问题,希望园友们可以帮忙解答一下!     所谓IOC(控制反转)或者说是依赖注入,就是将你设计好的类交给系统去控制,而不是在你的类内部控制,控制权发生了变化,就称为控制反转。
913 0
再不懂时序就 OUT 啦!,DBengine 排名第一时序数据库,阿里云数据库 InfluxDB 正式商业化!
阿里云数据库 InfluxDB® 版已于近日正式启动商业化 。 InfluxDB 是 DBengine 网站时序数据库类目排名第一的数据库产品,广泛应用于互联网基础资源监控,容器监控,业务运营监控分析,物联网设备远程实时监控,工业安全生产监控,生产质量评估和故障回溯。
3099 0
使用W“.NET技术”CF实现SOA面向服务编程——简单的WCF开发实例
  前面为大家介绍过WCF的特点,现在再讲解一下WCF基础概念。   在WCF里,各个Application之间的通信是由EndPoint来实现的,EndPoint是WCF实现通信的核心要素。一个WCF Service可由多个EndPoint集合组成,每个EndPoint只能有一种绑定,就是说EndPoint就是通信的入口,客户端和服务端通过 EndPoint交换信息。
690 0
使用WCF实现SOA面向服务编程——使用AJAX+WCF服务“.NET技术”页面开发
  在上一篇讲到,如果将BLL层的每一个类都转化为*.svc,这是一个不实在的想法。它会使服务变化复杂,难于管理。   这时候,我们第一时间想到的是23个简单开发模式中的Factory,在这里,Factory正好派上用场。
869 0
.NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(4)
7.使用ADO.NET实现(工厂模式-实现多数据库切换)(4) 7.7 业务逻辑层HomeShop.BLL OrderBiz.cs View Code  1 using System; 2 using System.
775 0
+关注
夏春涛
曾任教于信息工程大学16年,长期从事计算机软件与信息安全教学科研工作,目前任职于某软件公司从事技术管理工作,擅长架构设计、开发管理,对大数据、分布式颇感兴趣。
271
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载