数据库访问活动

本主题适用于 Windows Workflow Foundation 4。

数据库访问活动可用于在一个工作流内访问数据库。通过这些活动,可以访问数据库以检索或修改信息,并使用 ADO.NET 访问数据库。

Ee622977.Important(zh-cn,VS.100).gif 注意:
您的计算机上可能已安装这些示例。在继续操作之前,请先检查以下(默认)目录:

<安装驱动器>:\WF_WCF_Samples

如果该目录不存在,请转到(下载页)以下载所有 Windows Communication Foundation (WCF) 和 WF 示例。此示例位于以下目录:

<安装驱动器>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\DbActivities

数据库活动

以下部分详细介绍了此示例中包含的活动列表。

DbUpdate

执行可在数据库中产生修改(插入、更新、删除和其他修改)的 SQL 查询。

此类采用异步方式执行其工作(它派生自 AsyncCodeActivity 并使用其异步功能)。

通过设置提供程序固定名称 (ProviderName) 和连接字符串 (ConnectionString),或仅使用应用程序配置文件中的连接字符串配置名称 (ConfigFileSectionName),可以配置连接信息。

要执行的查询在其 Sql 属性中配置,并通过 Parameters 集合传递参数。

执行 DbUpdate 后,在 AffectedRecords 属性中返回受影响的记录的数量。

Public class DbUpdate: AsyncCodeActivity
{
    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DefaultValue(null)]
    public InArgument<string> ProviderName { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DependsOn("ProviderName")]
    [DefaultValue(null)]
    public InArgument<string> ConnectionString { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConfigFileSectionName")]
    [DefaultValue(null)]
    public InArgument<string> ConfigName { get; set; }

    [DefaultValue(null)]
    public CommandType CommandType { get; set; }

    [RequiredArgument]
    public InArgument<string> Sql { get; set; }

    [DependsOn("Sql")]
    [DefaultValue(null)]
    public IDictionary<string, Argument> Parameters { get; }

    [DependsOn("Parameters")]
    public OutArgument<int> AffectedRecords { get; set; }     
}

参数

说明

ProviderName

ADO.NET 提供程序固定名称。如果设置此参数,则必须还要设置 ConnectionString

ConnectionString

用于连接到数据库的连接字符串。如果设置此参数,则必须还要设置 ProviderName

ConfigName

存储连接信息的配置文件部分的名称。设置此参数之后,将不再需要 ProviderNameConnectionString

CommandType

要执行的 DbCommand 的类型。

Sql

要执行的 SQL 命令。

Parameters

SQL 查询的参数集合。

AffectedRecords

最后一个操作影响的记录的数量。

DbQueryScalar

执行可从数据库检索单个值的查询。

此类采用异步方式执行其工作(它派生自 AsyncCodeActivity 并使用其异步功能)。

通过设置提供程序固定名称 (ProviderName) 和连接字符串 (ConnectionString),或仅使用应用程序配置文件中的连接字符串配置名称 (ConfigFileSectionName),可以配置连接信息。

要执行的查询在其 Sql 属性中配置,并通过 Parameters 集合传递参数。

执行 DbQueryScalar 之后,将在 Result out 参数中返回标量(此参数为 TResult 类型,并在基类 AsyncCodeActivity 中定义)。

public class DbQueryScalar<TResult> : AsyncCodeActivity<TResult>
{
    // public arguments
    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DefaultValue(null)]
    public InArgument<string> ProviderName { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DependsOn("ProviderName")]
    [DefaultValue(null)]
    public InArgument<string> ConnectionString { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConfigFileSectionName")]
    [DefaultValue(null)]
    public InArgument<string> ConfigName { get; set; }

    [DefaultValue(null)]
    public CommandType CommandType { get; set; }

    [RequiredArgument]
    public InArgument<string> Sql { get; set; }

    [DependsOn("Sql")]
    [DefaultValue(null)]
    public IDictionary<string, Argument> Parameters { get; }
}

参数

说明

ProviderName

ADO.NET 提供程序固定名称。如果设置此参数,则必须还要设置 ConnectionString

ConnectionString

用于连接到数据库的连接字符串。如果设置此参数,则必须还要设置 ProviderName

ConfigName

存储连接信息的配置文件部分的名称。设置此参数之后,将不再需要 ProviderNameConnectionString

CommandType

要执行的 DbCommand 的类型。

Sql

要执行的 SQL 命令。

Parameters

SQL 查询的参数集合。

Result

执行查询后获得的标量。此参数的类型为 TResult

DbQuery

执行可检索对象列表的查询。执行查询后,将执行一个映射函数(它可以为 Func<DbDataReaderTResult> 或 ActivityFunc<DbDataReaderTResult>)。此映射函数在 DbDataReader 中获取一个记录,并将其映射到要返回的对象。

通过设置提供程序固定名称 (ProviderName) 和连接字符串 (ConnectionString),或仅使用应用程序配置文件中的连接字符串配置名称 (ConfigFileSectionName),可以配置连接信息。

要执行的查询在其 Sql 属性中配置,并通过 Parameters 集合传递参数。

使用 DbDataReader 检索 SQL 查询的结果。此活动将循环访问 DbDataReader,并将 DbDataReader 中的行映射到 TResult 的实例。DbQuery 的用户必须提供映射代码。可以通过两种方法执行此操作:使用 Func<DbDataReader, TResult> 或 ActivityFunc<DbDataReader, TResult>。在第一种情况下,将在单个执行脉冲中完成映射。因此,此方法的速度更快,但无法序列化为 XAML。在后一种情况下,将在多个脉冲中完成映射。因此,此方法的速度较慢,但可序列化为 XAML,并以声明方式进行创作(任何现有活动均可参与映射)。

public class DbQuery<TResult> : AsyncCodeActivity<IList<TResult>> where TResult : class
{
    // public arguments
    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DefaultValue(null)]
    public InArgument<string> ProviderName { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DependsOn("ProviderName")]
    [DefaultValue(null)]
    public InArgument<string> ConnectionString { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConfigFileSectionName")]
    [DefaultValue(null)]
    public InArgument<string> ConfigName { get; set; }

    [DefaultValue(null)]
    public CommandType CommandType { get; set; }

    [RequiredArgument]
    public InArgument<string> Sql { get; set; }

    [DependsOn("Sql")]
    [DefaultValue(null)]
    public IDictionary<string, Argument> Parameters { get; }

    [OverloadGroup("DirectMapping")]
    [DefaultValue(null)]
    public Func<DbDataReader, TResult> Mapper { get; set; }

    [OverloadGroup("MultiplePulseMapping")]
    [DefaultValue(null)]
    public ActivityFunc<DbDataReader, TResult> MapperFunc { get; set; }
}

参数

说明

ProviderName

ADO.NET 提供程序固定名称。如果设置此参数,则必须还要设置 ConnectionString

ConnectionString

用于连接到数据库的连接字符串。如果设置此参数,则必须还要设置 ProviderName

ConfigName

存储连接信息的配置文件部分的名称。设置此参数之后,将不再需要 ProviderNameConnectionString

CommandType

要执行的 DbCommand 的类型。

Sql

要执行的 SQL 命令。

Parameters

SQL 查询的参数集合。

Mapper

映射函数 (Func<DbDataReader, TResult>),它接受在执行查询后获得的 DataReader 中的一个记录,并返回一个 TResult 类型的对象的实例(此实例将被添加到 Result 集合中)。

在这种情况下,将在单个执行脉冲中完成映射,但不能使用设计器以声明方式创作它。

MapperFunc

映射函数 (ActivityFunc<DbDataReader, TResult>),它接受在执行查询后获得的 DataReader 中的一个记录,并返回一个 TResult 类型的对象的实例(此实例将被添加到 Result 集合中)。

在这种情况下,将在多个执行脉冲中完成映射。此函数可序列化为 XAML,并以声明方式进行创作(任何现有活动均可参与映射)。

Result

对象列表,这些对象是通过执行查询并对 DataReader 中的每个记录执行映射函数得到的。

DbQueryDataSet

执行可返回 DataSet 的查询。此类以异步方式执行其工作。它派生自 AsyncCodeActivity<TResult> 并使用其异步功能。

通过设置提供程序固定名称 (ProviderName) 和连接字符串 (ConnectionString),或仅使用应用程序配置文件中的连接字符串配置名称 (ConfigFileSectionName),可以配置连接信息。

要执行的查询在其 Sql 属性中配置,并通过 Parameters 集合传递参数。

执行 DbQueryDataSet 之后,将在 Result out 参数中返回 DataSet(此参数为 TResult 类型,并在基类 AsyncCodeActivity 中定义)。

public class DbQueryDataSet : AsyncCodeActivity<DataSet>
{
    // public arguments
    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DefaultValue(null)]
    public InArgument<string> ProviderName { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConnectionString")]
    [DependsOn("ProviderName")]
    [DefaultValue(null)]
    public InArgument<string> ConnectionString { get; set; }

    [RequiredArgument]
    [OverloadGroup("ConfigFileSectionName")]
    [DefaultValue(null)]
    public InArgument<string> ConfigName { get; set; }

    [DefaultValue(null)]
    public CommandType CommandType { get; set; }

    [RequiredArgument]
    public InArgument<string> Sql { get; set; }

    [DependsOn("Sql")]
    [DefaultValue(null)]
    public IDictionary<string, Argument> Parameters { get; }
}

参数

说明

ProviderName

ADO.NET 提供程序固定名称。如果设置此参数,则必须还要设置 ConnectionString

ConnectionString

用于连接到数据库的连接字符串。如果设置此参数,则必须还要设置 ProviderName

ConfigName

存储连接信息的配置文件部分的名称。设置此参数之后,将不再需要 ProviderNameConnectionString

CommandType

要执行的 DbCommand 的类型。

Sql

要执行的 SQL 命令。

Parameters

SQL 查询的参数集合。

Result

执行查询后获得的 DataSet

配置连接信息

所有 DbActivities 共享相同的配置参数。可以通过两种方式进行相关配置:

  • ConnectionString + InvariantName:设置 ADO.NET 提供程序固定名称和连接字符串。

    Activity dbSelectCount = new DbQueryScalar<DateTime>()
    {
        ProviderName = "System.Data.SqlClient",
        ConnectionString = @"Data Source=.\SQLExpress;
                             Initial Catalog=DbActivitiesSample;
                             Integrated Security=True",
        Sql = "SELECT GetDate()"
    };
    
  • ConfigName:设置包含连接信息的配置部分的名称。

    <connectionStrings>    
        <add name="DbActivitiesSample"
             providerName="System.Data.SqlClient"
             connectionString="Data Source=.\SQLExpress;Initial Catalog=DbActivitiesSample;Integrated Security=true"/>
      </connectionStrings>
    
  • 在活动中:

    Activity dbSelectCount = new DbQueryScalar<int>()
    {                
        ConfigName = "DbActivitiesSample",
        Sql = "SELECT COUNT(*) FROM Roles"
    };
    

运行此示例

设置说明

此示例使用一个数据库。此示例提供了一个安装和加载脚本 (Setup.cmd)。必须使用命令提示执行该文件。

Setup.cmd 脚本调用 CreateDb.sql 脚本文件,该文件包含可执行下列操作的 SQL 命令:

  • 创建一个名为 DbActivitiesSample 的数据库。

  • 创建 Roles 表。

  • 创建 Employees 表。

  • 将 3 个记录插入到 Roles 表中。

  • 将 12 个记录插入到 Employees 表中。

运行 Setup.cmd

  1. 打开命令提示。

  2. 转到 DbActivities 示例文件夹。

  3. 键入“setup.cmd”,然后按 Enter。

    Ee622977.note(zh-cn,VS.100).gif注意:
    Setup.cmd 尝试将此示例安装在您本地计算机的 SqlExpress 实例中。如果您需要在其他 SQL Server 实例中安装它,请将 Setup.cmd 改为使用新的实例名称。

卸载示例数据库

  1. 在命令提示中运行示例文件夹中的 Cleanup.cmd。

运行示例

  1. 在 Visual Studio 2010 中打开解决方案

  2. 若要编译解决方案,请按 F6。

  3. 若要运行示例而不进行调试,按 Ctrl+F5。

Ee622977.Important(zh-cn,VS.100).gif 注意:
您的计算机上可能已安装这些示例:在继续操作之前,请先检查以下(默认)目录:

<安装驱动器>:\WF_WCF_Samples

如果此目录不存在,请转到 .NET Framework 4 的 Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 示例(可能为英文网页),下载所有 Windows Communication Foundation (WCF) 和 WF 示例。此示例位于以下目录:

<安装驱动器>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\DbActivities