自动生成三层结构代码(3)--生成数据访问层Insert方法

版权所有:基础软件。作者邮箱:sun.j.l.studio@gmail.com。本文首发于 http://www.cnblogs.com/FoundationSoft。文章转载请保持此版权信息并注明出处。

数据访问层包括CRUD功能。自动生成代码时,可以自动生成这4个方法。本例以Northwind数据库中的Orders表为例,说明如何自动生成数据访问层的insert方法,以实现插入数据的功能。当然,生成代码的代码是与数据库表无关的,可以生成任意表的代码。这里以Orders表为例,只是为了便于讨论最终生成的代码结构。

先来看下要生成的insert方法代码。如果不用自动生成,那么这些代码就应该是手写的。看这些代码的目的是为了明确最终我们要得到的产品是什么样子的,从而能够知道中间过程所做工作的目的。

 

ContractedBlock.gif ExpandedBlockStart.gif insert方法代码
 
   
1 // 插入新数据
2   public void insert(Orders item)
3 {
4 Database db = DbUtility.getDatabase();
5   // 以下为生成的insert语句
6   string sql = @" insert into Orders (
7 OrderID,CustomerID,EmployeeID,OrderDate,RequiredDate,ShippedDate,ShipVia,Freight,ShipName,ShipAddress,ShipCity,ShipRegion,ShipPostalCode,ShipCountry)
8 values (
9 @OrderID,@CustomerID,@EmployeeID,@OrderDate,@RequiredDate,@ShippedDate,@ShipVia,@Freight,@ShipName,@ShipAddress,@ShipCity,@ShipRegion,@ShipPostalCode,@ShipCountry) " ;
10 DbCommand command = db.GetSqlStringCommand(sql);
11   // 为数据库命令添加参数
12   db.AddInParameter(command, " @OrderID " ,DbType.Int32,item.OrderID);
13 db.AddInParameter(command, " @CustomerID " ,DbType.String,item.CustomerID);
14 db.AddInParameter(command, " @EmployeeID " ,DbType.Int32,item.EmployeeID);
15 db.AddInParameter(command, " @OrderDate " ,DbType.DateTime,item.OrderDate);
16 db.AddInParameter(command, " @RequiredDate " ,DbType.DateTime,item.RequiredDate);
17 db.AddInParameter(command, " @ShippedDate " ,DbType.DateTime,item.ShippedDate);
18 db.AddInParameter(command, " @ShipVia " ,DbType.Int32,item.ShipVia);
19 db.AddInParameter(command, " @Freight " ,DbType.Decimal,item.Freight);
20 db.AddInParameter(command, " @ShipName " ,DbType.String,item.ShipName);
21 db.AddInParameter(command, " @ShipAddress " ,DbType.String,item.ShipAddress);
22 db.AddInParameter(command, " @ShipCity " ,DbType.String,item.ShipCity);
23 db.AddInParameter(command, " @ShipRegion " ,DbType.String,item.ShipRegion);
24 db.AddInParameter(command, " @ShipPostalCode " ,DbType.String,item.ShipPostalCode);
25 db.AddInParameter(command, " @ShipCountry " ,DbType.String,item.ShipCountry);
26 db.ExecuteNonQuery(command);
27 command.Dispose();
28 }

分析以上代码,其思路为,(1)先定义一条insert的sql语句,(2)根据sql语句生成一个DbCommand,(3)为DbCommand的各个字段添加参数,(4)然后执行DbCommand。

 

自动生成代码也是按照上述步骤来进行。

第一步,生成insert的sql语句。这个语句字符串需要根据表结构来生成。代码如下。

 

ContractedBlock.gif ExpandedBlockStart.gif 生成insert的sql语句
 
   
1
2   // 生成insert的sql语句
3   private string getInsertSql()
4 {
5 StringBuilder sb = new StringBuilder();
6 string temp = null ;
7 temp = " insert into " + table + " ( " ;
8 sb.Append(temp + Environment.NewLine);
9 // 添加各列
10   foreach ( string n in columnNames)
11 {
12 sb.Append(n + " , " );
13 }
14 // 去掉最后一个逗号
15   sb.Remove(sb.Length - 1 , 1 );
16 temp = " ) " + Environment.NewLine + " values ( " + Environment.NewLine;
17 sb.Append(temp);
18 // 添加各个参数
19   foreach ( string n in columnNames)
20 {
21 sb.Append( " @ " + n + " , " );
22 }
23 // 去掉最后一个逗号
24   sb.Remove(sb.Length - 1 , 1 );
25 sb.Append( " ) " );
26 return sb.ToString();
27 }

第二步,生成insert方法。代码如下。

ContractedBlock.gif ExpandedBlockStart.gif 生成insert方法


 
   
1 // 生成数据访问类insert方法代码
2   public string generateInsertMethod()
3 {
4 StringBuilder sb = new StringBuilder();
5 string temp = null ;
6 temp = " //插入新数据 " ;
7 sb.Append(temp + Environment.NewLine);
8 temp = " public void insert( " + table + " item) " ;
9 sb.Append(temp + Environment.NewLine);
10 sb.Append( " { " + Environment.NewLine);
11 temp = " Database db=DbUtility.getDatabase(); " ;
12 sb.Append(temp + Environment.NewLine);
13 temp = " //以下为生成的insert语句 " ;
14 sb.Append(temp + Environment.NewLine);
15 temp = " string sql=@\ "" + getInsertSql() + " \ " ; " ;
16 sb.Append(temp + Environment.NewLine);
17 temp = " DbCommand command=db.GetSqlStringCommand(sql); " ;
18 sb.Append(temp + Environment.NewLine);
19 temp = " //为数据库命令添加参数 " ;
20 sb.Append(temp + Environment.NewLine);
21 temp = getAddParameterCode();
22 sb.Append(temp);
23 temp = " db.ExecuteNonQuery(command); " ;
24 sb.Append(temp + Environment.NewLine);
25 temp = " command.Dispose(); " ;
26 sb.Append(temp + Environment.NewLine);
27 sb.Append( " } " + Environment.NewLine);
28 return sb.ToString();
29 }

上面的代码用到以下一个方法。

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
1 private string getAddParameterCode()
2 {
3 return getAddParameterCode(allColumns);
4 }
5   /// <summary>
6   /// 生成向DbCommand添加参数的语句
7   /// </summary>
8   /// <param name="columns"> 要添加参数的列(每列添加一个参数) </param>
9   /// <returns> 生成的代码 </returns>
10   private string getAddParameterCode(DataColumn[] columns)
11 {
12 StringBuilder sb = new StringBuilder();
13 string temp = null ;
14 foreach (DataColumn c in columns)
15 {
16 temp = " db.AddInParameter(command,\ "@" + c.ColumnName + " \ " ,DbType. " + c.DataType.Name + " ,item. " + c.ColumnName + " ); " ;
17 sb.Append(temp);
18 sb.Append(Environment.NewLine);
19 }
20 return sb.ToString();
21 }

 

 

转载于:https://www.cnblogs.com/FoundationSoft/archive/2010/08/20/1804558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值