.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

 

目录
打赏
0
0
0
0
6
分享
相关文章
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
218 4
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
328 69
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
基于Transformer架构的时间序列数据去噪技术研究
本文介绍了一种基于Transformer架构的时间序列去噪模型。通过生成合成数据训练,模型在不同噪声条件下展现出强去噪能力。文章详细解析了Transformer的输入嵌入、位置编码、自注意力机制及前馈网络等关键组件,并分析实验结果与注意力权重分布。研究为特定任务的模型优化和专业去噪模型开发奠定了基础。
231 14
基于Transformer架构的时间序列数据去噪技术研究
新闻聚合项目:多源异构数据的采集与存储架构
本文探讨了新闻聚合项目中数据采集的技术挑战与解决方案,指出单纯依赖抓取技术存在局限性。通过代理IP、Cookie和User-Agent的精细设置,可有效提高采集策略;但多源异构数据的清洗与存储同样关键,需结合智能化算法处理语义差异。正反方围绕技术手段的有效性和局限性展开讨论,最终强调综合运用代理技术与智能数据处理的重要性。未来,随着机器学习和自然语言处理的发展,新闻聚合将实现更高效的热点捕捉与信息传播。附带的代码示例展示了如何从多个中文新闻网站抓取数据并统计热点关键词。
199 2
新闻聚合项目:多源异构数据的采集与存储架构
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
让数据与AI贴得更近,阿里云瑶池数据库系列产品焕新升级
4月9日阿里云AI势能大会上,阿里云瑶池数据库发布重磅新品及一系列产品能力升级。「推理加速服务」Tair KVCache全新上线,实现KVCache动态分层存储,显著提高内存资源利用率,为大模型推理降本提速。
IPIP.NET-IP地理位置数据
IPIP.NET 是一家专注于 IP 地理位置数据的提供商,基于 BGP/ASN 数据与全球 800+ 网络监测点技术,提供高精度的 IPv4 和 IPv6 定位服务。其核心服务包括地理位置查询、详细地理信息和网络工具等,广泛应用于网络安全、广告营销、CDN 优化等领域。数据覆盖全球,支持多语言,每日更新确保实时性。IPIP.NET 提供 API 接口、离线数据库及多种语言 SDK,方便开发者集成使用。
407 0
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错

热门文章

最新文章

AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等