自动生成三层结构代码(1)概述和准备工作

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

最近做一小程序,使用.NET Framework 2.0。程序很小,数据库中主要只有3个表。

由于上述两原因,一是.NET版本低,二是程序确实很小,就没有使用ORM框架,而是打算手写ADO.NET代码,毕竟工作量也不大。

结果写了将近2个表的数据访问层代码以后,感觉写重复代码太多,还不如写个工具自动生成呢,这样节约出来的时间也抵得上写工具本身的时间了,而且这个工具写出来以后还可以继续用。而且,还可以给学生当作毕业设计题目。

写这个工具以前,也从网上找了类似源码。这些源码毕竟是现成的东西,生成的代码与我手写的代码风格不一样。好在这个工具工作量不大,就自己写好了。自己写得看着最舒服,用着最顺心。于是就写了一个自动生成三层结构代码的工具,此工具可以生成实体类、数据访问层、业务逻辑层代码。其实主要是前二者,业务逻辑层只是一个代码框架,调用数据访问层的相关方法,程序不可能智能到能够获取和实现业务逻辑的。

今天写了一部分,可以生成实体类代码和数据访问层的INSERT和UPDATE功能。就尽量讲得详细一点吧。

本程序的功能前面已经说过了。不过生成的代码是基于Enterprise Library的,其实仅用到了其中的一个类Database。这个类的功能就是封装了一些常用的ADO.NET代码。如果你不使用Enterprise Library,则很容易把我代码修改一下,换成原始的ADO.NET代码。如果你也用原始的ADO.NET代码写程序,或者使用Enterprise Library写程序,那么这个工具可以实用。但是更重要的,还是通过这个例子交流思想,体会这种最简单的自动代码生成工具的实现。授人以鱼不如授人以渔。

首先来点铺垫,这个类与具体代码生成无关,但是在代码生成时会用到,只有3条代码。 

代码
/// <summary>
/// 数据库工具类,封装一些常用功能
/// 孙继磊
/// </summary>
public static class DbUtility
{
const string ConnectionKey = "db";
//根据配置文件中ConnectionString中名称为db连接字符串返回一个Database对象
//这个Database是EnterpriseLibrary中定义的类
public static Database getDatabase()
{
return DatabaseFactory.CreateDatabase(ConnectionKey);
}
}

索性把配置文件也贴上来,大多数人都知道什么内容,就跳过吧。

 

<connectionStrings>
<add name="db" connectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>

下面这自动生成代码的类。类名叫AutoDatabase,名字先随便起的,不太合适,以后再改。先看类中定义的成员变量和构造函数。

 

1 /// <summary>
2 /// 自动代码生成类
3 /// 孙继磊,sun.j.l.studio@gmail.com
4 /// </summary>
5  
6 public sealed class AutoDatabase
7 {
8 #region 成员变量
9 string table; //数据库表名
10   bool schemaLoad = false; //数据库表架构是否已经加载
11   DataColumn[] allColumns = null; //表中所有列的集合
12   DataColumn[] primaryKey = null; //表的主键
13   DataColumn[] notKeyColumns = null; //非主键列
14   string[] columnNames = null; //列名数组
15   const string DalCalssSuffix = "Dal"; //数据访问层类名后缀
16   #endregion
17
18
19 #region 构造函数
20 public AutoDatabase(string tableName)
21 {
22 table = tableName;
23 getTableSchema();
24 }
25 #endregion

下面一个方法获得表构架。

 

1 #region 得到表架构,获得所有列信息,获得的信息保存在成员变量中
2
3  private void getTableSchema()
4 {
5 if (schemaLoad ) return; //如果已经加载,则不重复加载
6 //以下代码获取表架构
7   Database db = DbUtility.getDatabase();
8 DbCommand command = db.GetSqlStringCommand("select * from " + table + " where 1=2");
9 command.Connection = db.CreateConnection();
10 DbDataAdapter a = db.GetDataAdapter(); //得到数据适配器
11   a.SelectCommand = command;
12 DataTable dataTable = new DataTable();
13 a.FillSchema(dataTable, SchemaType.Source); //用数据适配器填充表构架
14   command.Dispose();
15 //将表架构列信息保存到成员变量中备用
16   allColumns=new DataColumn[dataTable.Columns.Count];
17 primaryKey = dataTable.PrimaryKey; //获得主键列
18 notKeyColumns = new DataColumn[allColumns.Length - primaryKey.Length];
19 int n = allColumns.Length;
20 columnNames=new string[n];
21 List<DataColumn> notKeys = new List<DataColumn>();
22 //下面的循环获取非主键列
23 for (int i = 0; i < n; i++)
24 {
25 DataColumn column = dataTable.Columns[i];
26 allColumns[i] = column;
27 columnNames[i] = column.ColumnName;
28 if (Array.IndexOf<DataColumn>(primaryKey, column) < 0)
29 notKeys.Add(column);
30 }
31 notKeyColumns = notKeys.ToArray();
32 }
33 #endregion

 

 

内容不少了,先到这里,转下一篇。

posted @ 2010-08-11 10:05  基础软件  阅读(1460)  评论(0编辑  收藏  举报