【问题标题】:WF 4.5: Is it possible to add variables dynamically at runtime?WF 4.5:是否可以在运行时动态添加变量?
【发布时间】:2016-07-19 20:29:00
【问题描述】:

我们正在编写自定义活动。在此活动中,可以设置数据库连接字符串和存储过程的名称。在运行时,存储过程正在执行。现在我们有了一些带有输入参数的存储过程。

是否可以在 WF 4.5 中为存储过程中的每个输入参数动态生成变量?从存储过程中读取参数不是问题,但我不知道如何生成变量。

示例: 用户输入要执行的存储过程的名称(2 个输入参数@Variable1 和@Variable2)。现在在变量选项卡中应该有 2 个变量:@Variable1 和@Variable2。如果用户在存储过程中更改了名称,那么变量选项卡中应该是新的参数(例如只有@Variable2)...

我们在这个问题上花了很多时间。但是我们唯一了解到的是,活动必须是 NativeActivity,并且应该在 CacheMetadata 方法中添加变量。但是,如果我使用 AddVariable() 方法添加一个变量,则不会发生任何事情:(

【问题讨论】:

    标签: c# workflow-foundation-4 dynamic-variables


    【解决方案1】:

    如果您愿意包含第三方库,您可以尝试使用像 Dapper 这样的 ORM 工具来完成此操作。 Dapper 查询通常采用匿名类型来提供其参数。从数据库中的字段创建自定义对象的典型代码如下所示:

    IDbConnection db = New IDbConnection(...);
    int id = 527; // normally passed in - using a hard coded value would defeat the purpose...
    string myQuery = "SELECT Engine, Transmission, Make, Model, BodyStyle FROM Table WHERE ID = @ID";
    Car result = db.Query<Car>(myQuery, new { ID = id }).First();
    

    所以我相信您可以使用反射来通过反射传入类型(“汽车”)并创建一个匿名对象或在运行时传入具有“ID”属性的实际对象。假设 Car 对象具有 Engine、Transmission、Make、Model、BodyStyle 等属性,它将使用结果数据自动创建自定义 Car 对象。

    请注意,如果您不提供您希望返回的类型,您会得到一个 ExpandoObject:Creating an anonymous type dynamically? - 您也可以将其中之一传递给您的输入参数,这意味着您可以在运行时创建它。

    这个家伙想出了一个 Dapper 的通用方法,可能会对你有所帮助:http://www.bradoncode.com/blog/2012/12/creating-data-repository-using-dapper.html

    他想出的是这样的:

    IEnumerable<T> items = null;
    
    // extract the dynamic sql query and parameters from predicate
    QueryResult result = DynamicQuery.GetDynamicQuery(_tableName, predicate);
    
    using (IDbConnection cn = Connection)
    {
        cn.Open();
        items = cn.Query<T>(result.Sql, (object)result.Param);
    }
    
    return items;
    

    【讨论】:

    • 感谢您的回复!但我的问题只是在工作流程基础上。我想动态添加用户可以用值填充的变量。这些值用作存储过程的输入参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2021-09-28
    • 1970-01-01
    • 2023-04-07
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多