65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SubSonic 生成数据层

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.20/5 (5投票s)

2008年5月20日

Ms-PL

5分钟阅读

viewsIcon

45233

downloadIcon

591

本文将演示如何使用 SubSonic 生成数据访问层。

引言

在本文中,我想探讨一个非常强大且功能丰富的数据库访问层工具包:SubSonic。撰写本文的初衷是我在寻找一些开源工具包来支持我的数据库访问代码。我当时正在寻找一个开源的工具包,它应该具备一些基本功能,例如:

  • 支持 BusinessObject 模式。
  • 必须支持代码生成器,用于逆向工程现有的数据库。
  • 可以集成到构建环境中,用于即时生成业务对象和从现有数据库结构生成 SQL 脚本。
  • 必须足够智能,能够检测对象关系,并以 get<related_object_name> 的形式生成代码。
  • 可以从 app.configweb.config 进行配置。

经过一番寻觅,我最终选择了 SubSonic。在继续之前,我想先设置好环境。首先要做的就是从 这里 下载 SubSonic。这是一个开源工具包。

下载后,将 SubSonic 安装在默认位置,即 {Program Files}\SubSonic

现在,打开命令提示符,然后进入:{Program Files}\SubSonic\SubSonic<Version>\SubCommander。然后,输入命令 sonic。您将看到如下非常丰富的输出:

  • sonic.exe v2.0.3.0 - SubSonic v2.0.3.0 的命令行界面
  • 用法:sonic command [options]
  • 示例:sonic generate /server localhost /db EntLibQuickStarts /out GeneratedFiles
  • 帮助:sonic help
  • 提示:SubSonic 将读取您的 App.ConfigWeb.Config - 只需选择项目,然后运行您的命令。

Commands

  • version:将数据库的模式/数据脚本输出到文件
  • scriptdata:将数据脚本输出到文件,用于您的数据库
  • scriptschema:将数据库模式脚本输出到文件
  • generate:为表、视图和存储过程生成输出代码
  • generatetables:为您的表生成输出代码
  • generateODS:为每个表生成一个 ObjectDataSource 控制器
  • gienerateviews:为您的视图生成输出代码
  • generatesps:为您的存储过程生成输出代码
  • editor:创建一个特定表的编辑器。

参数列表

  • #######:所有命令都必需(这些可以从配置文件读取);如果您没有 Web.ConfigApp.config,则需要设置这些参数
  • /override:SubCommander 不会尝试查找配置文件 - 而是使用您传入的参数
  • /server - 数据库服务器 - 始终必需
  • /db - 要使用的数据库

其他命令(某些命令可能对特定命令是必需的)

  • /userid - 数据库的用户 ID(空白 = 使用 SSPI)
  • /password - 数据库的密码(空白 = 使用 SSPI)
  • /out - 生成项目的输出目录(默认 = 当前目录)
  • /lang - 生成的代码语言:csvb(默认 = cs)
  • /provider - 要使用的提供程序的名称
  • /includeTableList - 用于生成类,一个逗号分隔的列表,定义了哪些表应用于生成类
  • /config - 您的 App/Web.Config 的路径 - 用于实例化 SubSonic
  • /excludeTableList - 与 /includeTableList 相反;这些表将被用于生成类

以上海量输出中有用的选项是:

  • generate:用于指定为数据库中的所有表生成代码的选项。
  • /server:用于指定数据库所在服务器的名称,例如 localhost
  • /db:用于指定我们感兴趣的数据库,例如 Northwind。
  • /out:用于指定生成代码文件的输出目录。
  • /lang:用于指定代码生成语言。

我想现在您已经熟悉了 SubSonic 的选项。如果是,那么请执行以下命令:

sonic generate /server localhost /db EntLibQuickStarts /out BO

以上命令将生成十二个代码文件,如下所示:

  • AllStructs.cs:包含用于保存数据库中所有表和视图名称的结构。
  • Credit.cs:包含 Credit 表的业务对象实现。
  • CreditController.cs:包含 Credit 表的 Factory Controller 的实现。
  • Customer.cs:包含 Customer 表的业务对象实现。
  • CustomerController.cs:包含 Customer 表的 Factory Controller 的实现。
  • Debit.cs:包含 Debit 表的业务对象实现。
  • DebitController.cs:包含 Debit 表的 Factory Controller 的实现。
  • Order.cs:包含 Order 表的业务对象实现。
  • OrderController.cs:包含 Order 表的 Factory Controller 的实现。
  • Product.cs:- 包含 Product 表的业务对象实现。
  • ProductController.cs:- 包含 Product 表的 Factory Controller 的实现。
  • StoredProcedures.cs:包含所有存储过程的包装器。

要创建业务层,请打开您的 IDE,如 VS 或 SharpDevelop,然后创建一个名为 EntLibQuickStarts 的新类库项目。将上述生成的代码文件添加到新创建的项目中,并从安装位置添加对 Subsonic.dll 的引用,然后生成项目。

要测试业务层,请在同一解决方案中创建另一个名为 TestApp 的 Windows 应用程序项目。创建一些 UI 布局来显示和编辑数据库中的数据,例如 datagridviews 和 textboxes。

添加 App.config 文件,并将以下节添加到其中:

<configSections>

<section name="SubSonicService" type="SubSonic.SubSonicSection, 
    SubSonic" allowDefinition="MachineToApplication"
    restartOnExternalChanges="true" requirePermission="false"/>

</configSections>

<appSettings/>

<connectionStrings>

<add name="EntLibQuickStarts" 
    connectionString="Data Source=localhost; 
    Database=EntLibQuickStarts; Integrated Security=true;"/>

</connectionStrings>

<SubSonicService defaultProvider="EntLib" >

<providers>

<clear/>

<add name="default" type="SubSonic.SqlDataProvider,
   SubSonic" connectionStringName="EntLib" 
   generatedNamespace="aicl.data" /> 

<add name="EntLib" type="SubSonic.SqlDataProvider, SubSonic" 
    connectionStringName="EntLib" generatedNamespace="aicl.data" /> 

</providers>

</SubSonicService>

基本上,SubSonic 支持 ActiveRecord 模式,这意味着一个对象实例代表表中的一条记录。因此,为了模拟与表相同的行为,我们需要使用对象集合并将集合绑定到 UI 控件。不要被这些术语搞糊涂了,因为 SubSonic 非常智能,它会生成业务对象以及生成代码中的对象集合,所以您只需要使用生成的集合实例,并通过 BusinessObjectControllers FetchAll 方法获取记录。

首先要做的是为 BusinessObjectControllerBusinessObjectCollection 创建一个对象。

ProductController pc=null;

ProductCollection pr=null;

下一步是添加一个标题为 Load 的按钮,并将以下代码添加到点击处理程序中:

pr=pc.FetchAll();

this.bindingSource1.DataSource=pr;

dataGridView1.DataSource=bindingSource1;

this.comboBox1.DataSource=pr;

this.comboBox1.DisplayMember="ProductName";

this.comboBox1.ValueMember="ProductID";

现在,应用程序已准备好运行。要支持 CRUD 操作,还需要做一些收尾工作。

为了支持所有操作,为所有操作添加 UI 按钮,并添加如下代码:

void BtnNewClick(object sender, EventArgs e)
{
    try
    {
        pc.Insert("Shower to Shower",1,45,DateTime.Now);
        BtnLoadClick(null,null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString(),ex.Message);
    }

}
void BtnDeleteClick(object sender, EventArgs e)
{
    try
    {
        pc.Delete((object)5);
        BtnLoadClick(null,null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString(),ex.Message);
    }
}

void DataGridView1Selection(object sender,EventArgs e)
{
    if (dataGridView1.SelectedRows.Count>0)
    {
        Product p=pr[dataGridView1.SelectedRows[0].Index];
        or=p.Orders();
        this.dataGridView2.DataSource=or;
    }
}

void BtnUpdateClick(object sender, EventArgs e)
{
    try
        {
            pr.SaveAll();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message,ex.Source);
        }
}

void BtnSortClick(object sender, EventArgs e)
{
    try
    {
        pr=pr.OrderByDesc("CategoryID");
        BtnLoadClick(null,null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message,ex.Source);
    }
}

现在,我们拥有一个功能齐全的应用程序,它由 SubSonic 提供支持,并支持业务层和数据层。

© . All rights reserved.