一、创建数据库
工作流实例怎样保存到数据库呢?首先SQL Server已经提供一套专门存储工作流实例的数据库,当你安装上sql server后它就已经存在sql脚本,脚本就是的目录是:%WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN 。
两个数据库是:
-
SqlWorkflowInstanceStoreSchema.sql
-
SqlWorkflowInstanceStoreLogic.sql
找到后执行,得到以下数据库:
二、用代码实现持久化工作流实例
可通过使用 SqlWorkflowInstanceStore 对象模型为以编程方式使用 WorkflowApplication 的自承载工作流启用持久性。
用demo说明:
首先是工作流流程代码:
<span style="font-size:18px;">namespace WFDurable { /// <summary> /// 输入两个整数,输出这两个整数之和 /// </summary> public sealed class TestActivity : CodeActivity { // 定义一个整数类型的活动输入参数 public InArgument<int> number1 { get; set; } public InArgument<int> number2 { get; set; } //定义一个整数类型的活动输出参数 public OutArgument<int> outNumber { get; set; } // 如果活动返回值,则从 CodeActivity<TResult> // 派生并从 Execute 方法返回该值。 protected override void Execute(CodeActivityContext context) { // 获取 Text 输入参数的运行时值 int num1 = context.GetValue(this.number1); int num2 = context.GetValue(this.number2); context.SetValue(outNumber, num1 + num2); } } } </span>
创建一个windows窗体,如下:
源代码是:
<span style="font-size:18px;">using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Activities; using System.Activities.DurableInstancing; using System.Runtime.DurableInstancing; namespace WFDurable { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //SqlWorkflowInstanceStore类派生自持久性功能的抽象 System.Runtime.Persistence.InstanceStore 类,并提供实现以允许将实例状态信息保存到SQL Server 2005 或 SQL Server 2008 数据库,或从该数据库中加载实例状态信息。 //1.流程数据库持久化对象准备 SqlWorkflowInstanceStore instanceStore = new SqlWorkflowInstanceStore("server=.;database=countersignatureDB;uid=sa;pwd=123456"); //2.Execute是异步持久化到数据库第一个参数是实例句柄,第二个参数是需要执行的命令,第三个参数是持久化数据库超时时间返回值为InstanceView视图,包括持久化的数据的实例数据(摘自MSDN) InstanceView view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(10)); //3.设置实例的默认所有者,SqlWorkflowInstanceStore默认只使用单一的WorkflowApplication.当使用多个工作流的时候会发生一个异常,SqlWorkflowInstanceStore does not support creating more than one lock owner concurrently. Consider setting InstanceStore.DefaultInstanceOwner to share the store among many applications.当设置这个属性的时候不会有这个问题了。如果确认只有一个工作流时也必须把DefaultInstanceOwner设置为Null,否则垃圾回收器可能不会回收这块内存。(MSND说的是可能) instanceStore.DefaultInstanceOwner = view.InstanceOwner; //4.1实例化一个活动 Activity activity = new TestActivity(); //4.2创建流程实例并传入参数 WorkflowApplication application = new WorkflowApplication(activity); //5.关联流程对象到数据库(countersignatureDB中的InstancesTable表) application.InstanceStore = instanceStore; //6.把流程实例保存到数据库中 application.Persist(); //流程ID显示到文本框。 txtID.Text = application.Id.ToString(); } } }</span>
其中第二三步骤不是持久化必须的代码。
执行的效果就是: