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

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

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

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语句。这个语句字符串需要根据表结构来生成。代码如下。

生成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方法。代码如下。

生成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 }

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

代码

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

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

  1. 自动生成三层结构代码(2)--生成实体类

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

  2. Entity Framework 6三层架构入门:创建数据访问层DAL

    回顾 上次我们讲到了Model的创建,现在来了解什么是DAL. DAL是针对Model的访问,可以这么说,Model是项目的逻辑操作对象,DAL就是最基本的方法:DAL直接访问数据库.也就是说,该层的 ...

  3. PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层

    第十四章 数据访问层指导 概览 这一章主要描述设计数据访问层时要注意的主要原则.它们覆盖了设计数据访问层遇到的通常问题及错误.下面的图表展示了数据层怎样嵌入一个通用的应用架构. (cnblog我的图片 ...

  4. 数据访问层代码自动生成

    <%-- Name:   数据访问层代码自动生成 Author: 水木 Description: 用来生成三层结构数据访问层代码 --%> <%@ CodeTemplate Lang ...

  5. 全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自动化部署项目(TableGo v8.0.0)

    TableGo_20220801 v8.0.0 正式版发布,此次版本累计更新如下:  1.生成项目功能新增支持若依框架,可同时生成若依框架代码和所有业务表的前后端基础CRUD代码,一键搞定所有  2. ...

  6. 基于Matlab Simulink开发的嵌入式模型,模型可自动生成ccs工程代码,生成的代码可直接运行在主控芯片中

    主控芯片dsp tms320f28335,基于Matlab Simulink开发的嵌入式模型,模型可自动生成ccs工程代码,生成的代码可直接运行在主控芯片中. 该模型利用id=0的矢量控制,实现了永磁 ...

  7. ClownFish:比手写代码还快的通用数据访问层

    最近花了二个月的业余时间重写了我以前的通用数据访问层, 由于是重写,所以我给这个项目取了个新名字:ClownFish 如果需要了解ClownFish的使用方法,请点击ClownFish 使用说明 Cl ...

  8. 企业级应用架构(二)三层架构之数据访问层的封装与抽象

    在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供 ...

  9. 三层架构:表示层——业务逻辑层——数据访问层

    三层架构:表示层--业务逻辑层--数据访问层 1.什么是三层架构 所谓的三层开发就是将系统的整个业务应用划分为表示层--业务逻辑层--数据访问层,这样有利于系统的开发.维护.部署和扩展. 分层是为了实 ...

最新文章

  1. 学习搭建Hadoop+HBase+ZooKeeper分布式集群环境
  2. 李宏毅深度学习——分类
  3. Jackson 注解 -- 忽略空字段
  4. Scala模式匹配:类型匹配
  5. 【简明表】MATLAB + 矩阵运算
  6. 数据库元数据数据字典查询_10_列出数据库里的所有对象
  7. PC远程调试移动设备
  8. c语言生命游戏代码大全,c++生命游戏源码
  9. 利用微软的平台进行Office文档的在线查看
  10. cefsharp异步抓取html5,winform插件cefsharp65最新版完美demo,完美flash、html5、和调用摄像头支持,部署就能用...
  11. ASP.NET Core:使用IdentityServer构建可靠的身份验证和授权系统
  12. PIP scrapydo时报错ERROR: Command errored out with exit status 1: python setup.py egg_info Check the log
  13. 如何用 Linux 技巧大大提高工作效率?
  14. 机器学习-入门杂谈(转载)
  15. 企业经营数据分析-读后感
  16. 中文编程发展与兴起的重要意义
  17. 马科维茨模型 matlab,马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(四)...
  18. Linux 程序编译过程的来龙去脉
  19. avr模拟串口通讯c语言,AVR的模拟串口的问题
  20. shell脚本学习(十三)——for循环语句

热门文章

  1. python职场应用_大学粗略学习过Python,在进入职场后如何进一步学习Python
  2. android 恢复短信 失败,解决安卓手机发送短信失败的方法
  3. mysql 存储过程游标删除_mysql数据库存储过程游标循环,提前退出
  4. c++判断整数翻转溢出_LeetCode7.整数反转(Reverse Integer)
  5. elementui可编辑单元格_关于遥感解译点室内解译编号的读取编辑方法
  6. ssh远程工具_良心国产工具,比Xshell好用还免费!
  7. 电气毕业生在国家电网都干啥工作?
  8. 我的10年富士康故事
  9. 拆解Mate 30 Pro,内部双重散热、铜管一体紫色防滚架,太酷了!
  10. vb.net 如何文件指定打印机打印文件_使用Dropbox文件请求配合Canon Inkjet实现多用户文件打印...