从 Microsoft Access 或 SQL Server 数据库自动创建数据访问层和业务层
如何从 Microsoft Access 或 SQL Server 数据库自动创建数据访问层和业务层。
引言
此版本的 LayerGen 已过时,已被 LayerGen 3.5 取代。请参考该项目,而不是此项目!
Layergen 是我编写的一个程序,它可以根据 SQL Server 数据库或 Microsoft Access 数据库自动创建数据访问层和业务层。Layergen 可以生成 C# 或 VB.NET 代码,并且与 ASP.NET 1.1、ASP.NET 2.0 和 ASP.NET 3.0 及更高版本兼容,此外还支持 Windows Forms 应用程序和 WFC 应用程序。它还支持数据加密和排序等高级功能。
LayerGen 的目标
在设计 LayerGen 时,我考虑了以下目标:
- 简洁易用:市面上很多代码生成器要求您回答大量问题,并且需要您是编程专家。我不想这样。除了几个基本问题,Layergen 基本上能完成它应该做的事情,而无需太多技术术语。我认为这一目标已经实现。
- 简单明了的代码:同样,许多代码生成器会生成复杂且难以理解的代码。当您需要修改代码以满足您的需求时,这可能会造成问题。我认为 LayerGen 采取了一种直接的方法。代码干净易懂,即使是新手程序员也能理解。同样,我认为这一目标已经实现。
- 强大的兼容性:我希望 Layergen 能够为所支持的语言的所有版本生成代码。这一目标已经实现,因为生成的代码将适用于 VB.NET 或 C#.NET 1.1,直至当前的 3.5 版本。
- 易于扩展:我编写 LayerGen 的方式是,未来可以轻松实现其他数据库服务器和其他语言。这一目标尚未 100% 完成,但可能已完成约 80%。一旦完成,我将起草一份 API 文档,第三方开发者将能够创建自己的插件来支持任何语言或数据库服务器!
Using the Code
使用 Layergen 非常简单。运行程序时,您需要指定 SQL Server、用户名、密码、数据库、目标语言以及将生成输出文件的目标目录。如果单击“高级选项”按钮,则会出现以下对话框:
在此对话框中,您可以启用排序(强烈推荐),这将允许您按表中的任何字段对记录集合进行排序。您还可以让 Layergen 自动将存储过程插入表中(实验性功能)。如果未启用此选项,则会生成一个名为 Procedures.SQL 的文件,其中包含所需的存储过程。请注意,如果您使用的是 Microsoft Access 数据库,则无论是否选中此框,存储过程都会自动插入。您还可以启用数据加密。这将无缝加密表中的所有文本数据。
选择好选项后,单击“创建层”按钮,然后将弹出表/视图选择器:
现在,您可以选中要让 Layergen 为其创建层的每个表或视图旁边的复选框。请注意,如果您选择了一个包含另一个表外键的表,则还必须为该表生成层。“选择依赖项”按钮将自动为您选择这些表。
单击“确定”后,将生成层,并放置在您之前指定的目录中。就这么简单!
使用生成的代码
要使用代码,首先需要将存储过程插入数据库(除非您让 Layergen 自动执行此操作)。您可以从 Procedures.SQL 文件中复制过程,然后粘贴到 SQL Server 中。如果您的数据库是 Microsoft Access 数据库,则可以跳过此步骤,因为 Layergen 会自动插入过程。
将过程准备好后,下一步是将生成的代码文件包含到您的项目中。每个表都有两个生成的文件(一个用于业务层,一个用于数据层)。除了这些文件外,还有一个 Universal 文件和一个 Interface 文件。Universal 文件基本上是您的 SQL Server 或 Microsoft Access 数据库的连接字符串。如果您使用的是 Microsoft Access,则可能希望此连接字符串是动态的,根据用户安装您的应用程序的位置而定。此文件中包含注释,说明如何在 ASP.NET 应用程序中将连接字符串放在 Web.Config 文件中。
将这些文件包含到项目中后,您的项目应该可以成功编译。此时,您就可以使用代码了。让我们来看一些示例。在这些示例中,我们假设您的数据库中有两个表,一个名为 Address
(包含字段:AddressID
、FirstName
、LastName
、City
、StateID
、Zip
),另一个名为 State
(包含字段:StateID
、Statename
)。
向数据库插入新记录
Dim State As New BusinessLayer.State
State.Statename = "California"
State.Save()
就是这样!简单明了,不是吗?
从数据库检索记录
Dim State As New BusinessLayer.State(1) ' Retrieve record from State table
MessageBox.Show("The State is: " + State.StateName)
这将从数据库检索主键为 1
的记录。
一次检索多条记录并将其绑定到 DataGrid
Dim States As New BusinessLayer.States()
States.GetAll()
States.Sort(FIRSTNAME, ASCENDING) ' Only works if you enabled sorting
dgStates.DataSource=States
dgStates.DataBind()
请注意,在检索多条记录时,我们使用的是 States
而不是 State
。State
是单个记录的对象表示。而 States
是一个集合类,用于保存多个 State
对象。该集合类可以索引(像数组一样访问)或枚举(因此您可以使用 For Each
遍历所有记录)。
以下是加载记录并访问外键的示例:
Dim Address As New BusinessLayer.Address(2)
MessageBox.Show(Address.FirstName + " " + Address.LastName + _
" Lives in "+Address.FState.StateName)
所有外键都可以通过 F<tablename>
(在此示例中为 FState
)进行访问。
您也可以在 Layergen 中创建自己的自定义查询。例如,假设我们只想检索 FirstName
= 'Joe' 的记录。为此,首先,在数据库中创建相应的存储过程。您可以将 GetAll
存储过程用作模板。接下来,打开生成的DataAccess 文件(例如 AddressData.VB),向下滚动到标记为“自定义查询方法”的区域。只需取消注释代码并阅读注释即可实现您的自定义过程。最后,打开业务文件(例如 AddressBusiness.VB),向下滚动到自定义查询区域,并按照那里的说明进行操作。
我附带了一个示例应用程序,这是一个非常基本的应用程序,它将向您展示如何插入、更新、删除和选择记录。正如您所见,Layergen 具有强大的功能。如果您需要任何其他帮助或示例,我很乐意为您效劳!
已知错误/限制
Layergen 存在一些限制:
- 您的表必须至少有一个主键(可以有多个,但只使用第一个)。
- 主键必须设置为 true。 (此限制在新版本中已过时。)
- 主键必须是
Int
类型。(此限制在新版本中已过时。)
LayerGen 的未来
以下是 Layergen 的一些未来增强/目标:
- 支持插件功能,以便第三方开发者可以编写 SQL 插件或语言插件。这已经有所开始。源代码的编写方式支持这一点,但仍有许多工作要做。
- 能够加密特定字段,而不是整个表。
- 能够更改数据库结构,并让 Layergen 自动“合并”更改到生成的代码中(而不是必须删除文件,用 Layergen 重新生成,然后再次添加到项目中)。
- 能够创建自己的自定义查询和存储过程,并在 Layergen 中保存这些查询,以便在数据库结构更改时可以重新使用它们。
- 修复依赖项跟踪器按钮,并添加在图表中可视化查看数据库结构的功能(类似于 SQL Server 中的图表功能)。
- 添加能够从不同表中提取字段并将其保存在单个对象中的功能。这意味着拥有视图的功能,但具有
Save()
功能!
历史
- 2008 年 7 月 12 日 -- 发布了 Layergen 的 0.98b 版本。
- 2008 年 7 月 13 日 -- 添加了一个示例 zip 文件。
- 2008 年 8 月 5 日 -- 发布了 LayerGen 的 0.99 版本!LayerGen 现在支持 Microsoft Access 数据库,并修复了一些错误。具体来说,修复了 C# 生成的代码逻辑中的错误。希望大家喜欢这个版本!
- 2008 年 8 月 14 日 -- 更新了 Layergen 以支持表中包含“特殊”字符的 SQL Server 表。还修复了一些错误。
- 2008 年 11 月 5 日 -- 发布了 LayerGen 的 0.99e 版本!此版本修复了多项内容。首先,主键字段不再需要设置为 true。此外,这些字段不仅可以是整数,还可以是任何其他数据类型,包括
UniqueIdentifier
(GUID)。此外,存储过程的自动插入存在一个错误,即无法插入已存在于 SQL 数据库中的过程。此错误已修复。现在 Layergen 也支持 SQL Server Windows 身份验证。最后,对 C# 进行了许多 bug 修复。我知道自从上次更新以来已经有一段时间了。我的工作让我非常忙碌。我没有太多机会测试这些更改。此版本进行了许多重大更改。因此,我也保留了旧版本在此站点上,以防出现我没有发现的巨大 bug。感谢您的支持,请继续留下反馈和愿望清单的建议。我确实会尝试实现我能做到的所有建议,所以不要认为您的愿望被忽略了。请记住,我的全职工作让我非常忙碌,很难有时间投入到 LayerGen 中。