`
pcajax
  • 浏览: 2174363 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C# 代码生成器 & 网站架构设计

阅读更多
 

自己写的一个 web 版简易 C# Code Generator,可快速产生某个数据库中,所有表 Mapping 的 C# 3.0 类。可当作网站分层开发、表单大量传递用户输入值、在内存里持久化保存值之用,亦可当作 NHibernate 等 O/R Mapping 框架套用时的 C# 代码生成器。

因敝人觉得 CodeSmith、MyGeneration 软件产生的类和代码太复杂,不见得符合自己所需,甚至市面上有些代码生成器还要收费,遂自己随手用 ASP.NET 写了一个代码生成器,并分享出来。功能尚简,以后有时间再继续扩充。

-------------------------------------------------
本帖的示例下载点:
http://files.cnblogs.com/WizardWu/091216.zip

(执行本示例,需要 SQL Server 的 Northwind 数据库,以及 VS 2008 或 IIS)
-------------------------------------------------

双击 CodeGenerator.sln,开启网站后,如下图 1,下拉菜单中,会自动撷取网站 Web.config 中,一至多个数据库连接的字符串。



图 1 程序执行画面,用户可自定义要生成的 C# 类其部分内容


图 2 程序会自动撷取 Web.config 中的一至多个数据库连接字符串


如下图 3,单击「列出此数据库的所有表」按钮后,会在 GridView 控件中,列出这个数据库的所有「表 (Table)」和「视图 (View)」。用户可逐一勾选,或全选要创建的表之后,再单击「开始创建」按钮即可。



图 3 创建后的 C# 类,会自动产生在此网站  底下的 Entities 文件夹里


下图 4 为创建的 C# 类其内容。C# 的类型,会和数据库中的类型自动做对应,例如 string 对应 varchar、Int16 对应 smallint。当然您可视自己的需求,修改代码再扩充。



图 4 创建的 C# 类其内容,用户可选择是否要加入 NHibernate 的 Attribute


本示例用了一个 ADO.NET 书上教的技巧,搭配 DataReader,在单一次的数据库 connection 中,一次就取回多句 SQL 语句,所要撷取的多个 ResultSet (此为多行多列的二维类型数据), 以提升程序性能,如下方代码所示:

 

genDataSet()
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 using (SqlConnection conn = new SqlConnection(strConnString))
2 {
3 conn.Open();
4 using (SqlCommand cmd = new SqlCommand())
5 {
6 cmd.Connection = conn;
7 cmd.CommandText = strSql;
8 using (SqlDataReader dr = cmd.ExecuteReader())
9 {
10 //多次颉取 ResultSet (多行多列的二维类型数据)
11   for (int ii = 0; ii < intDataTableCount; ii++ )
12 {
13 dtInsertInput = new DataTable();
14
15 dcInsertInput = new DataColumn();
16 dcInsertInput.DataType = Type.GetType("System.String");
17 dcInsertInput.ColumnName = "TableName";
18 dtInsertInput.Columns.Add(dcInsertInput);
19
20 dcInsertInput = new DataColumn();
21 dcInsertInput.DataType = Type.GetType("System.String");
22 dcInsertInput.ColumnName = "ColumnName";
23 dtInsertInput.Columns.Add(dcInsertInput);
24
25 dcInsertInput = new DataColumn();
26 dcInsertInput.DataType = Type.GetType("System.String");
27 dcInsertInput.ColumnName = "DataType";
28 dtInsertInput.Columns.Add(dcInsertInput);
29
30 while (dr.Read())
31 {
32 drInsertInput = dtInsertInput.NewRow();
33 drInsertInput["TableName"] = dr.GetString(1);
34 drInsertInput["ColumnName"] = dr.GetString(2);
35 drInsertInput["DataType"] = dr.GetString(6);
36 dtInsertInput.Rows.Add(drInsertInput);
37 //Response.Write(dr.GetString(1) + ", " + dr.GetString(2).ToString() + ", " + dr.GetString(6).ToString() + "<br>");
38   }
39
40 //将这一次撷取的 ResultSet,存入一个新的 DataTable 后,再把这一个 DataTable 存入 DataSet 里
41   ds.Tables.Add(dtInsertInput);
42
43 //dtInsertInput.Clear();
44  
45 dr.NextResult(); //到 DataReader 的下一个 ResultSet 继续读取数据
46  
47 Label1.Text += "已经创建了第 " + ds.Tables.Count + " 个类<br>";
48 }
49 }
50
51 dcInsertInput.Dispose();
52 dtInsertInput.Dispose();
53 }
54 }
55  

 


有关此 ADO.NET 的小技巧,有兴趣的网友可参考这篇文章:

使用 ADO.NET 的 NextResult 方法取得多个 Result Set
http://www.cnblogs.com/WizardWu/archive/2008/07/11/1241174.html


有些网站系统的设计,会采用「分层式; 多层式 (n-Tier)」的架构,如下图 5 所示。在 Layer 与 Layer 之间的数据传递,或电子表单中用户所输入的多个字段值的传递,亦可透过此种 Mapping 映射类的 instance,来帮忙传递大量的数据;还有些 Java/J2EE 的书中会提到,可再将这些数据暂存在内存中,以做一些「持久性 (persistence)」的延伸应用,这些暂存在内存里的 class 的多个字段值,以后随时可从内存中取出再使用。

 



图 5 分层的网站系统,透过 Model 实例层、C# 实例 (instance),帮忙传递用户在表单中输入的大量数据

 

Model 实例层
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->namespace com.公司名称.项目名称.Model
{
public class Product //此一「类」的名称,会对应至数据库的同名「数据表」Product
{
private int _id; //此为 .NET 的「字段(field)」,对应至 Product 表的同名「字段」ID
private string _name;
private decimal _price;
 

public int ID //此为 .NET 的「属性(property)」,对应至 Product 表的同名「字段」ID
{
set { _id = value; }
get { return _id; }
}
 
        public decimal Price
{
set { _price = value; }
get { return _price; }
}

        public string Name
        {
           
set { _name = value; }
           
get { return _name; }
        }
    }
}

 

View 展示层
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public partial class _Default : System.Web.UI.Page
{
//用户单击 submit 送出按钮,欲「添加」一笔记录到数据库的 Product 表
protected void Button1_Click(object sender, EventArgs e)
{
com.公司名称.项目名称.Model.Product model
= new com.公司名称.项目名称.Model.Product(); //一个 Model 实例层的对象

com.公司名称.项目名称.BLL.Product bll
= new com.公司名称.项目名称.BLL.Product(); //一个 BLL 层的对象 

model.ID = TextBox1.Text;      //将用户在表单中,所输入的 ID 数据,存储(set) 至 Model 实例层的对象
       model.Name = TextBox2.Text;    //将用户在表单中,所输入的 Name 数据,存储(set) 至 Model 实例层的对象
       model.Price = TextBox3.Text;   //将用户在表单中,所输入的 Price 数据,存储(set) 至 Model 实例层的对象

 
bll.executeInsert(model); //将包装好的用户输入数据的集合,传递至 BLL 商业逻辑层
}
}

 

BLL 商业逻辑层
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->namespace com.公司名称.项目名称.BLL
{
public class Product
{
//一个 DAL 数据访问层的对象
private com.公司名称.项目名称.DAL.Product dal = new com.公司名称.项目名称.DAL.Product();
 
        public int executeInsert(com.公司名称.项目名称.Model.Product model)
        {
           
//这里可以加入其他的商业逻辑


//将包装好的用户输入数据的集合,传递至 DAL 数据访问层
return dal.executeInsert(model);
}
}
}

 

DAL 数据访问层
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->namespace com.公司名称.项目名称.DAL
{
public class Product
{
public int executeInsert(com.公司名称.项目名称.Model.Product model)
{
StringBuilder strSql
= new StringBuilder();
 
            //在这里组合出完整的 SQL 语句
            strSql.Append("INSERT INTO Product(ID, Name, Price) VALUES (@ID, @Name, @Price)"); 
 
            //ADO.NET 中的 SqlParameterCollection 类的应用,表单中所有输入数据的集合 
            System.Data.SqlClient.SqlParameter[] params = {
               
new SqlParameter("@ID", SqlDbType.Int),
               
new SqlParameter("@Name", SqlDbType.NVarchar, 30),
               
new SqlParameter("@Price", SqlDbType.Decimal) };
             
            //在这将用户在表单中输入的多个数据,逐一填入 SQL 语句里的「参数(parameters)」
            params[0].Value = model.ID;
           
params[1].Value = model.Name;
           
params[2].Value = model.Price;

            //将组合好的整句 SQL 语句,透过共用的「DBUtility 数据库访问类」DbHelper,抛入数据库去执行「添加」的动作 
            com.公司名称.项目名称.DBUtility.DbHelper dbh;
            int intResult = dbh.executeInsert(strSql.ToString(), params);
                        

return intResult;
}
}
}

 

当然,若您只是单纯要传递用户在表单中输入的多个值,并非一定要透过此种 Mapping 的 C# 类 instance,微软 ADO.NET 提供的 SqlParameterCollection 类也很好用,且可事先设置好对应的数据表里,字段的类型和长度,如上方 DAL 数据访问层里的代码。

 

若真正要谈到 O/R Mapping 的议题,其特性及优点甚多,例如可避免在代码中,直接写死特定的数据表字段名称,或避免在前端代码中出现 SQL 语句,以利于中大型系统日后的维护。其内容非三言两语可道尽,本文不再深入探讨。


分享到:
评论

相关推荐

    代码生成器&网站架构设计源码

    代码生成器&网站架构设计源码 web 版简易 C# Code Generator,可快速产生某个数据库中,所有表 Mapping 的 C# 3.0 类。可当作网站分层开发、表单大量传递用户输入值 、在内存里持久化保存值之用,亦可当作 ...

    C#代码生成器

    C#代码生成器是一种工具,它能够自动生成C#编程语言中的特定代码片段或整个项目的框架,极大地提高了开发效率和代码一致性。在软件开发过程中,尤其是企业级应用开发,经常需要遵循一定的架构模式,例如DAL(数据...

    C#代码生成器,C#代码生成器,C#代码生成器

    《C#代码生成器:自定义与高效开发的利器》 C#代码生成器是一种能够自动根据预设规则或模板生成C#代码的工具。它极大地提升了开发效率,减少了重复劳动,尤其在处理大量相似或者固定的代码结构时,其优势尤为明显。...

    .net C#代码生成器

    C#代码生成器,正如其名,是专为C#编程语言设计的,其核心功能是将预定义的模板或规则转换为可直接使用的源代码。开发者可以根据自己的需求定制代码模板,比如数据库访问层(DAL)、业务逻辑层(BLL)以及表示层(UI...

    c#代码生成器,非常好用

    c#代码生成器,用于生成三层结构体系代码

    CSharp C#代码生成器

    【CSharp C#代码生成器】是一个强大的工具,专为C#开发者设计,旨在提高开发效率,尤其是在处理大量数据操作和界面构建时。这个代码生成器可以自动生成用于Web应用程序和Windows Forms(Winform)应用的C#代码,极大...

    C#代码生成器ASP.NET代码生成器

    总的来说,C#代码生成器和ASP.NET代码生成器是提升ASP.NET开发效率的重要工具,它们通过自动化代码生成,降低了开发者的劳动强度,让开发者可以从重复性工作中解放出来,专注于更高层次的系统设计和创新。...

    C#代码生成器3.0

    C#代码生成器3.0是一款专为C#开发者设计的高效工具,旨在帮助程序员快速生成规范、高效的源代码,大大减轻了手动编写代码的工作量,提升了开发效率。在软件开发过程中,尤其是在大型项目中,重复的代码编写工作占据...

    C#代码生成器源码

    C#代码生成器是一种强大的开发工具,它能够自动化地创建C#编程语言的源代码,大大节省了开发者的时间和精力。这种工具通常基于模板或规则,可以自定义生成的代码结构,以适应不同的项目需求。在软件开发过程中,特别...

    C#三层代码生成器

    "C#三层代码生成器"是一个工具,旨在帮助开发者快速生成C#项目的三层架构代码,减少手动编写代码的工作量,提高开发效率。三层架构是一种常见的软件设计模式,它将应用程序分为三个主要层次:表现层(UI)、业务逻辑...

    C#代码生成器(源码)

    4. **设计模式**:代码生成通常涉及设计模式,如工厂模式、策略模式等,理解这些模式可以帮助你更好地组织代码生成器的架构。 通过深入学习和实践,你可以将这个C#代码生成器定制为适合你项目需求的工具,无论是...

    c# 多层架构代码生成器

    C#多层架构代码生成器是一款实用的开发辅助工具,专为C#编程语言设计,旨在简化和自动化在多层架构项目中的代码编写工作。多层架构是一种常见的软件设计模式,通常包括表现层(Presentation Layer)、业务逻辑层...

    C#代码生成器源码.rar

    C#代码生成器正是为了这一目标而设计的工具,它可以帮助开发者自动生成常见的编程元素,如实体类、数据库操作类、业务逻辑类以及存储过程,大大减轻了手动编写这些代码的工作量。本文将对"C#代码生成器源码.rar"进行...

    动软代码生成器C#代码自动生成工具

    动软代码生成器是一款专为C#开发者设计的高效工具,它极大地简化了开发过程中的编码工作,尤其在构建三层架构的应用程序时。三层架构是一种常见的软件设计模式,包括表现层(UI)、业务逻辑层(BLL)和数据访问层...

    C#三层架构代码生成器

    C#三层架构代码生成器是一种工具,用于自动化创建C#应用程序中的典型三层架构代码,显著提高了开发效率。三层架构是一种常见的软件设计模式,它将应用逻辑拆分为三个独立的层:表示层(Presentation Layer)、业务...

    c#代码生成器v3.01

    C#代码生成器v3.01是一款专为C#开发者设计的强大工具,它极大地提升了开发效率,尤其在处理Web及Winform应用的编码工作时。这款软件的主要功能是自动生成C#源代码,帮助程序员快速构建应用的基础框架,从而让他们...

    C#代码模板生成器;Model层;DAL层;BLL层代码自动生成

    在IT行业中,代码生成器是一种高效工具,它能够帮助开发者快速构建应用的基础架构,从而减少重复劳动和提高生产力。本文将深入探讨"C#代码模板生成器",特别是针对Model层、DAL(数据访问层)层和BLL(业务逻辑层)...

    代码生成器(Asp.net(c#))源码

    《Asp.net(C#)代码生成器源码详解》 在软件开发过程中,代码生成器是一种提高效率的重要工具,尤其在Asp.net(C#)框架下,它能够自动生成大量基础代码,帮助开发者快速构建应用的骨架。本文将深入探讨Asp.net(C#)...

Global site tag (gtag.js) - Google Analytics