创建一个SQL Server 跟踪数据库Word文档下载推荐.docx
《创建一个SQL Server 跟踪数据库Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《创建一个SQL Server 跟踪数据库Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
使用SqlTrackingServer服务
在工作流跟踪数据库设置好后,现在就是实际使用它的时候了。
我们先创建一个新的工作流并看看我们怎样去跟踪事件。
我们将创建一个稍微复杂一些的工作流,里面有几个事件可以提供给我们去进行跟踪。
在我们创建一个原始的工作流后,我们将增加必要的跟踪代码。
创建一个新工作流并进行跟踪
1.为更方便些,我已创建了两个版本的样例应用程序。
Workflow包含两个不同版本的应用程序:
一个是不完全版本,一个是完全版本。
完全版本已完全编写完成并可直接运行,非完全版本可方便你进行修改,并按步骤完成相应练习。
你可通过本章后面的下载链接下载这些项目文件。
2.下载本章源代码,打开TrackedWorkflow解决方案,像第三章中相应步骤一样创建一个顺序工作流库的项目,名称为TrackedWorkflow。
3.在你完成以上步骤后,VisualStudio会打开工作流设计器以便进行编辑。
4.从工具箱中拖动一个IfElse活动到设计器界面上。
如下图:
5.单击左边的ifElseBranchActivity1分支,激活它的属性使其在VisualStudio中的属性窗口中显示。
6.寻找ifElseBranchActivity1的Condition属性。
点击下拉列表框上向下的箭头打开下拉列表框,选择其中的代码条件节点。
7.Condition属性现在会在它的左边呈现出一个“+”号。
单击这个+号展开其属性网格,这会暴露出Condition属性的Condition名称字段。
在编辑框中,输入QueryDelay。
我们将使用这个方法来决定我们将执行IfElse活动的那个分支。
8.下一步我们在左边的分支(这个分支在条件值为True时执行)添加一些活动。
首先,从工具箱中拖拽一个Code活动到IfElse的左边分支即ifElseBranchActivity1上。
9.你看到的惊叹号标记的意思在前面的章节我已描述过,意思是我们还有工作要做。
在这里,它指出我们需添加一个方法,Code活动添加到工作流中执行时将调用这个方法。
在VisualStudio的属性面板上,定位到ExecuteCode属性,在该编辑框中输入PreDelayMessage。
10.也许你要看看我要做什么……其实就是添加一个延时工作流,在第三章我们已经创建过。
就像在第三章做的一样,再拖拽一个Delay活动和另一个Code活动进ifElseBranchActivity1中,然后设置它们的属性。
Delay活动延时10秒(00:
00:
10),第二个Code活动执行一个名称为PostDelayMessage的方法。
完成这些步骤后的设计器界面如下图所示:
11.在设计器中的工作完成后,我们就来添加相应代码。
在解决方案资源管理器中的Workflow1.cs文件上单击右键,选择查看代码。
然后在项目中添加对System.Windows.Forms的引用,然后在Workflow1.cs文件的顶部声明和其对应的下面的名称空间。
usingSystem.Windows.Forms;
12.你查看这个文件,你会看到VisualStudio为你添加的作为活动属性的三个事件处理程序:
PreDelayMessage、PostDelayMessage和QueryDelay。
和第三章类似,在Code活动中添加消息对话框,以使应用程序能在工作流执行时通知你。
对于PreDelayMessage,添加下面的代码:
MessageBox.Show("
Pre-delaycodeisbeingexecuted."
);
对于PostDelayMessage,添加下面的代码:
Post-delaycodeisbeingexecuted."
13.我们些许更感兴趣的是在QueryDelay中添加的以下代码:
e.Result=false;
//假定我们不延时
if(MessageBox.Show("
Okaytoexecutedelayinworkflowprocessing?
"
"
QueryDelay"
MessageBoxButtons.YesNo,
MessageBoxIcon.Question)==DialogResult.Yes)
{
//需进行延时处理
e.Result=true;
//显示消息
Console.WriteLine("
Delaypathtaken"
}//if
else
DelaypathNOTtaken"
}//else
14.完成上述步骤后,我们需要为我们的WorkflowTracker主应用程序添加对工作流项目TrackedWorkflow的项目引用,步骤略。
15.在WorkflowTracker项目中打开Program.cs文件,查找下面的代码:
Console.WriteLine("
Waitingforworkflowcompletion."
16.为创建一个Workflow实例,在上述代码下添加下面的代码:
//创建工作流实例。
WorkflowInstanceinstance=
workflowRuntime.CreateWorkflow(typeof(TrackedWorkflow.Workflow1));
//启动工作流实例。
instance.Start();
17.编译解决方案,纠正任何编译错误。
18.按下F5(或Ctrl+F5)执行这个应用程序,你将看到以下控制台的输出结果:
我们现在就有了一个基本的工作流,我们可使用它去体验WF的跟踪能力。
我们现在就回去添加我们需要的代码以执行跟踪。
为我们的工作流添加SqlTrackingService
1.WF由活动和工作流事件跟踪能力承载,因此我们不需为跟踪事件做太多工作。
尽管如此,我们仍然需在主程序文件中添加一些逻辑。
首先,要为WorkflowTracker应用程序添加System.Configuration引用,我们需要它来把访问数据库的连接字符串存储到应用程序的配置文件里。
2.下一步,为WorkflowTracker应用程序添加一个应用程序配置文件。
方法是在VisualStudio的解决方案管理器中的WorkflowTracker树节点上单击右键,依次选择添加、新建项。
在呈现的添加新项对话框中选择应用程序配置文件,点击确定。
这就为我们的应用程序添加了一个新的app.config文件。
参见下图:
3.打开app.config文件,在Configuration的开始标记和结束标记间插入下面的内容:
<
connectionStrings>
<
addname="
TrackingDatabase"
connectionString="
DataSource=(local)SQLEXPRESS;
InitialCatalog=WorkflowTracking;
IntegratedSecurity=True;
/>
/connectionStrings>
备注:
上面的连接字符串可能和你实际应用中有所不同,你需要灵活进行配置。
4.点击WorkflowTracker项目中的WorkflowFactory.cs文件,查看其代码。
5.在该文件中声明以下名称空间(需添加System.Configuration引用):
usingSystem.Workflow.Runtime.Tracking;
usingSystem.Configuration;
6.在WorkflowFactory.cs文件中,找到我们创建WorkflowRuntime实例的地方,在这里我们需要为WorkflowRuntime引入SqlTrackingService。
在GetWorkflowRuntime方法中添加下面的代码:
Stringconn=ConfigurationManager.ConnectionStrings["
].ConnectionString;
_workflowRuntime.AddService(newSqlTrackingService(conn));
完成了上述步骤,我们就添加了实际中要去执行跟踪的代码(稍后,我们会添加更多的代码来显示跟踪结果)。
编译该解决方案,然后按F5或Ctrl+F5执行它。
假如程序中出现ArgumentException异常,最可能的原因是运行时没有访问数据库的权限。
假如工作流运行正常,你可在WorkflowTracking数据库的ActivityInstance表中看到下图5-1中显示的结果。
图5-1表ActivityInstance中的记录
检索来自于工作流的跟踪记录
1.打开WorkflowTracker项目中的Program.cs文件。
2.在文件中声明以下名称空间:
usingSystem.Configuration;
usingSystem.Workflow.Runtime.Tracking;
3.在Main方法中,找到下面的代码:
waitHandle.WaitOne();
4.在上面的代码下添加以下的的代码:
ShowWorkflowTrackingEvents(instance.InstanceId);
ShowActivityTrackingEvents(instance.InstanceId);
5.上面我们调用的一组方法并不存在,我们需要添加它们。
在Program类中添加这些方法:
Code
//Theactivitytrackingrecorddisplaymethod
staticvoidShowActivityTrackingEvents(GuidinstanceId)
SqlTrackingQuerysqlTrackingQuery=newSqlTrackingQuery(ConfigurationManager.ConnectionStrings["
].ConnectionString);
SqlTrackingWorkflowInstancesqlTrackingWorkflowInstance=null;
sqlTrackingQuery.TryGetWorkflow(instanceId,outsqlTrackingWorkflowInstance);
if(sqlTrackingWorkflowInstance!
=null)
{
nActivityTrackingEvents:
n"
Status:
:
Date/Time:
QualifiedID"
foreach(ActivityTrackingRecordatrinsqlTrackingWorkflowInstance.ActivityEvents)
{
Console.WriteLine("
{0}:
{1}:
{2}"
atr.ExecutionStatus,atr.EventDateTime,atr.QualifiedName);
}//foreach
}//if
}
//Theworkflowinstancetrackingrecorddisplaymethod
staticvoidShowWorkflowTrackingEvents(GuidinstanceId)
nWorkflowInstanceEvents:
Description:
Date/Time"
foreach(WorkflowTrackingRecordworkflowTrackingRecordinsqlTrackingWorkflowInstance.WorkflowEvents)
{1}"
workflowTrackingRecord.TrackingWorkflowEvent,workflowTrackingRecord.EventDateTime);
}
}
在最后一步中忽然冒出大量的代码,但实际上并不太复杂。
我们首先创建了一个SqlTrackingQuery的实例,为它提供了我们曾提供给SqlTrackingService的相同的连接字符串。
然后我们通过当前工作流实例的ID(一个Guid)标识,从数据库中查询该实例的跟踪信息。
该查询由SqlTrackingService.TryGetWorkflow执行。
假如数据库中有我们指定的工作流的跟踪信息,我们循环获取跟踪记录(查询返回给我们的是一个workflowTrackingRecord对象的集合),从中提取我们感兴趣的信息。
假如查询结果中没有记录,也就没有跟踪信息写到控制台窗口中。
最终的屏幕的输出结果如图5-2所示(在调试模式下运行代码的话,你或许需要设置一个断点才能看到下图的输出结果)。