如何将数据集从活动传递到.net中的工作流程?

时间:2014-03-14 12:31:30

标签: .net .net-4.0 workflow-foundation-4

我创建了一个返回数据集的活动,如下所示:

public class DbQueryDataSet : AsyncCodeActivity<DataSet>
    {
        // private variables
        IDictionary<string, Argument> parameters;
        DbHelper dbHelper;


        // public arguments
        [DefaultValue(null)]
        public InArgument<string> ProviderName { get; set; }

        [DefaultValue(null)]
        public InArgument<string> ConnectionString { get; set; }

        [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
            {
                if (this.parameters == null)
                {
                    this.parameters = new Dictionary<string, Argument>();
                }
                return this.parameters;
            }
        }


        /*public DbQueryDataSet()
        {
            this.CommandType = CommandType.Text;
        }*/

        protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
        {
            // configure the helper object to access the database
            dbHelper = new DbHelper();
            dbHelper.ConnectionString = this.ConnectionString.Get(context);
            dbHelper.ProviderName = this.ProviderName.Get(context);
            dbHelper.ConfigName = this.ConfigName.Get(context);
            dbHelper.Sql = this.Sql.Get(context);
            dbHelper.CommandType = this.CommandType;
            dbHelper.Parameters = this.parameters;
            dbHelper.Init(context);

            // create the action for doing the actual work
            Func<DataSet> action = () => dbHelper.GetDataSet();
            context.UserState = action;

            return action.BeginInvoke(callback, state);
        }

        protected override DataSet EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
        {
            Func<DataSet> action = (Func<DataSet>)context.UserState;
            DataSet dataSet = action.EndInvoke(result);


            // dispose the database connection
            dbHelper.Dispose();
            Result.Set(context, dataSet);
            // return the state
            return dataSet;
        }
    }

然后创建工作流示例并将此活动放在工作流上并设置所需的属性。但是当我尝试访问此活动以获取数据集时,它什么也没有返回。如果我调试代码,那么它将进入EndExecute方法并正确填充数据集。但是没有任何内容返回到我们调用它的工作流程,下面是工作流应用程序示例的program.cs中使用的代码:

    Activity oActivity = new Workflow1();
    Dictionary<string, object> result = WorkflowInvoker.Invoke(oActivity);

这里它返回字典对象结果中的0个键。 任何人都可以帮忙我如何让数据集回到这里?
我正在使用.Net 4.0

2 个答案:

答案 0 :(得分:0)

WorkflowInvoker.Invoke()从工作流返回OutAurgument和InOutArguments。

我认为您只需添加一个方向为“Out”的Argument,并将该活动的结果与该参数挂钩。

答案 1 :(得分:0)

John Vottero是正确的,但没有明确提供所有步骤。

在工作流程中创建一个名为myWorkflowArgument的输入/输出参数(例如)。

在您的活动中创建一个名为myActivityArgument的输入/输出参数。

在工作流程级别,在您的活动的属性中,将myWorkflowArgument添加到myActivityArgument的字段

现在确保您的活动代码填满myActivityArgument。这意味着myActivityArgument的值在工作流级别可用作myWorkflowArgument。

然后,当工作流使用myWorkflowArgument作为键完成时,您可以将myWorkflowArgument与其他活动一起使用或从Dictionary结果中检索值。

参数名称取决于您。我通常使用与用于activity参数的工作流参数相同的名称,以便我可以判断它们应该保留的时间。