一、数据集基本应用
1.表格新增记录
//新增记录,推荐使用,光标位置处于当前新增记录,且正处理编辑状态
DataRow thisRow = ((DataRowView)usersBindingSource.AddNew()).Row;
thisRow["OID"] = 5;
thisRow["CNAME"] = "新增用户";
thisRow["sex"] = "m";
方式二:利用DataTable的NewRow
//新增记录(不建议使用,因为这种方式Rows.Add时并不处于编辑状态时会受约束影响,且新增时光标不会自动移动该条记录)
DataRow thisRow = userDataSet.Tables["Users"].NewRow();
thisRow["OID"] = 5;
thisRow["CNAME"] = "新增用户";
thisRow["sex"] = "m";
userDataSet.Tables["Users"].Rows.Add(thisRow);
2.表格删除记录
方式一:利用BindingSource的RemoveCurrent
if (usersBindingSource.Current != null)
//删除当前记录,推荐使用
usersBindingSource.RemoveCurrent();
方式二:利用DataRowCollection的Remove
//删除当前记录,不推荐使用,这种方式不会记录到RowState中,保存时不会更新
DataRow thisRow = getCurrentDataRow(usersBindingSource);
if (thisRow != null)
userDataSet.Tables["Users"].Rows.Remove(thisRow);
方式三:利用DataRow的Delete
//删除当前记录,不推荐使用,BindingSource可以更简洁
DataRow thisRow = getCurrentDataRow(usersBindingSource);
if (thisRow != null)
thisRow.Delete();
3.表格修改记录
方式一:利用DataRowObject[列名]直接修改
DataRow thisRow = getCurrentDataRow(usersBindingSource);
if (thisRow != null)
{
thisRow.BeginEdit();
thisRow["CNAME"] = "修改的名称";
thisRow.EndEdit();
}
4.表格查找和筛选记录
方式一:利用DataRowCollection.find查找
DataColumn[] keys = new DataColumn[1];
keys[0] = userDataSet.Tables["Users"].Columns["OID"];
userDataSet.Tables["Users"].PrimaryKey = keys;
DataRow findRow = userDataSet.Tables["Users"].Rows.Find("1");
if (findRow == null)
{
MessageBox.Show("没有找到");
}
else
{
MessageBox.Show("成功找到,CNAME = " + findRow["CNAME"]);
}
方式二:利用BindingSource.find查找
int i = usersBindingSource.Find("OID", "1");
if (i >= 0)
MessageBox.Show("成功找到,CNAME = " +
userDataSet.Tables["users"].Rows[i]["CNAME"]);
方式三:利用DataTable.Select获得DataRow数组
DataRow[] AryDr = userDataSet.Tables["users"].Select("OID > 1");
for (int i = 0; i < AryDr.Length; i++)
{
DataRow dr = AryDr[i];
MessageBox.Show(Convert.ToString((int)dr["OID"]));
}
5.表格记录的移动
方式一:采用BindingSource的方法或position属性实现。
//指定定位到哪一行,Position不会随表格列排序而变化,0不一定就是表格的第一行
usersBindingSource.Position = 0;
//移动到上一条,对于表格列排序后,上一条不定是界面显示表格的上一条
usersBindingSource.MovePrevious();
usersBindingSource.MoveNext();//移动到下一条
usersBindingSource.MoveFirst();
usersBindingSource.MoveLast();
6.表格的过滤
方式一:利用BindingSource的Filter来实现
usersBindingSource.Filter = "OID > 1";
7.数据集清空
方式一:利用DataTable.Clear(),注意这种不会保留删除状态,保存时不会真正删除
userDataSet.Tables["users"].Clear();
方式二:利用DataTable.Rows.Clear删除,注意这种不会保留删除状态,保存时不会真正删除
userDataSet.Tables["users"].Rows.Clear();
方式三:利用BindingSource.RemoveCurrent循环删除全部记录,这种就会保留删除状态。
while (usersBindingSource.Current != null)
usersBindingSource.RemoveCurrent();
8.数据集数据和结构的复制
方式一:整个数据集的复制
DataSet copyDS = userDataSet.Copy();
方式二:只复制单个表
DataSet copyDS = new DataSet();
copyDS.Tables.Add(userDataSet.Tables["users"].Copy());
方式三:只复制数据集的结构
copyDS = userDataSet.Clone();
MessageBox.Show(copyDS.Tables["users"].Rows.Count.ToString());
9.获取脏数据
方式一:整个数据集的脏数据
copyDS = userDataSet.GetChanges();
方式二:获取单个表的脏数据
DataTable dt = userDataSet.Tables["users"].GetChanges();
10.数据集的数据合并
方式一:整个数据集的DataSet.Merge合并
ds.Merge(userDataSet);
方式二:单个表的DataTable.Merge合并
ds.Merge(userDataSet.Tables["users"]);
11.数据集的数据回滚
方式一:数据集的数据回滚
userDataSet.RejectChanges();
方式二:数据表的数据回滚
userDataSet.Tables["users"].RejectChanges();
方式三:数据行的数据回滚
DataRow dr = getCurrentDataRow(usersBindingSource);
if (dr != null)
dr.RejectChanges();
12.数据集从数据库取数
方式一:利用SqlDataAdapter.Fill来填充数据表
this.usersTableAdapter.Fill(this.userDataSet.Users);
13.数据集更新到数据库
方式一:利用SqlDataAdapter.Update来更新到数据库
this.Validate();
this.usersBindingSource.EndEdit();
if (this.userDataSet.HasChanges())
{
this.usersTableAdapter.Update(this.userDataSet.Users);
MessageBox.Show("保存成功!");
}
14.判断数据集变更
方式一:利用DataSet.HasChanges()
15获取数据集表列集合
方式一:利用DataTable.Columns
DataColumnCollection dcc = userDataSet.Tables["users"].Columns;
for (int i = 0; i < dcc.Count; i++)
{
DataColumn dc = dcc[i];
MessageBox.Show(dc.ColumnName);
}
16获取属于该表的行的集合
方式一:利用DataTable.Rows
DataRowCollection drc = userDataSet.Tables["users"].Rows;
for (int i = 0; i < drc.Count; i++)
{
DataRow dr = drc[i];
MessageBox.Show((string)dr["CNAME"]);
}
然后在DAL(数据层)中新建一个.xsd数据集(名字可以自己定义):如下图
创建好了如下:
打开这个已创建好的TestDataSet.xsd:如下图
这里我选择从服务器资源管理器添加表进去,如下图
直接从右侧这些表中拉一张表到这个.xsd这个工作区中,例如我这拉了hg_ad表过去:
这就是.xsd自动生成的。
二:在BLL层就可以调用DAL层这里同的.xsd数据集中里面的GetData()这方法.
最近的一个项目:采用mysql 数据库,xsd做DAL层。在访问的时候把sqlconnection 等 用xsd(数据集)通过ODBC访问,其实在ASP.net和Mysql连接还可以通过 MySql.Data.dll去访问。具体请参照上一篇 asp.net+mysql.关于对象的访问,如xsd中的对象 可以通过objectdatasource 访问xsd中的表和方法等对象。
用MYSQL通过ODBC连接:但是在写XSD的时候需要加参数,其中的变量必须写出?才能执行.其中表名user是关键字,所以要写成`user`.UserID
webservice从字面上分解就是web service----一个提供web服务的系统,可以通过web方式访问这些服务。
而从现实中,webservice可以说是一套标准:分布式,跨平台,跨语言等; 标准实现采用SOAP协议,SOAP
协议是基于流行的XML表达的,具有一个套封envlope, envlope里包含一个必须的body和一个可选的head;
就是在这个body里,我们声明了访问的方法、方法的参数或返回值。
webservice实现, C++系统上采用开源的gSoap,而java采用apache的Axis。这两个框架都提供工具来
生成C++代码或Java代码,不管是gSoap或者Axis,他们生成的最终代码,客户端只需要调用简单的对象就
可以访问服务器,而服务器生成一样的接口,开发者实现这些接口就行,中间的通讯过程全部由框架解决了。
其实这种技术架构并不新颖,早期的CORBA和DCOM, 后来java的RMI, 这些基本上都是RPC技术,大同
小异而已。而它们的背后设计模式,可以说就是23种模式之一的代理模式Proxy。简言之就是,一个客户不想
或者不能直接引用一个对象(接口),而代理对象(接口)可以在客户端和目标对象之间起到中介作用。
按目的划分代理模式有8种:
1、远程代理:为位于不同的地址空间的对象提供一个局域代表对象
2、虚拟代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建
3、Copy-on-Write代理:把复制拖延到只有在客户需要时才真正采取行动
4、保护代理:控制对象的访问,提供使用权限检查
5、Cache代理:为某个目标操作的结果提供临时的存储空间,以便多客户共享
6、防火墙代理:保护目标,防止恶意用户
7、同步化代理:能同时访问对象而没有冲突
8、智能引用代理:提供一些额外操作,如访问次数统计
显然RPC方式属于第1种远程代理模式。
可以看出,在面对一种技术时,我们从它的定义、实现、引入目的、类似相关技术、背后理论基础来
细细分析,就比较容易掌握了。
工作流引擎是一个为工作流实例执行提供运行服务环境的软件,是工作流管
理系统的核心组件。工作流引擎负责解析、解释工作流过程定义、控制过程实例、
决定活动的执行次序、向用户工作表中添加工作项、调用应用程序、与其他工作
流引擎交互等功能。工作流引擎的作用不言而喻,就如计算机对于软件的作用
一样,可以说没有它,就没有工作流的一切,再好的流程设计也是无法有效执行
的,所以说它是工作流管理系统的核心组件。
工作流引擎的主要功能是:
1)实例化及执行过程定义:解释企业经营过程的过程定义,根据过程执行
需要的初始条件和执行参数生成过程实例,运行过程实例并管理其运行过程。过
程模型作为企业经营过程的一个模板,可以被执行多次,也可以有多个有关这个
过程模型的实例在同时运行。
2)为过程和活动的执行进行导航:根据过程定义和工作流相关数据,为过
程实例的运行进行导航。如根据过程的进入和退出的条件启动和终止一个过程实
例;根据活动之间的关联和活动的执行条件,决定并行或串行执行后续活动;给
用户提供需要操作的工作流任务项信息;或者根据所需激活的应用程序信息启动
相应的应用程序等等。
3)与外部资源交互完成各项活动:客户应用接口和直接调用应用接口方式。
对于客户应用方式,工作流引擎通过任务项列表管理器对应用的执行进行管理。
任务项列表管理器提供任务项列表供用户进行选择,并记录监督工作项的完成情
况,由用户完成从任务项列表管理器提供的任务项列表中选择相应的任务项,并
在需要的时候调用应用工具完成相应任务的执行,在任务执行完成后,用户需要
修改相关任务项的状态,如置完成标志,供任务项列表管理器使用。对于直接由
工作流引擎启动的活动,由工作流机直接调用相应的应用来完成,这些自动执行
的应用同样需要将合适的预先定义好的应用执行完成情况反馈给工作流机。
4)维护工作流控制数据和工作流相关数据:工作流在执行过程中要维护不
同过程和活动实例的内部状态信息,以及用于协调和恢复的各种检查数据和恢复
/重起信息,还包括用户传送的必要的相关数据。
解释 XQuery 的最佳方式是:XQuery 相对于 XML,等同于 SQL 相对于数据库。
XQuery 被设计用来查询 XML 数据。
◆简介
XQuery = XML Query,是W3C所制定的一套标准,用来从类XML文档中提取信息,类XML文档可以理解成一切符合XML数据模型和接口的实体,他们可能是文件或RDBMS。
XQuery有如下特点:

工作流软件(Workflow Software)的目的是在一个机构内用电子文档替换纸张文档系统,实现文档处理过程自动化。局域网络可提供将文档从存储设备中移进或移出,及在需要时观察、修改文档,或对文档进行签署(表明它们具有权威性)的用户之间进行路由选择。软件通过自动完成工作流程,从而消除人员必须的交接走动,鼓励工作组协作办公。典型工作流应用程序结合了具有电子消息传递功能和高级安全性功能的文档。其中高级安全性功能包括电子签名,以提供这个文档确是来自特定来源的证据,并提供它们已经被指定的某些关键人物进行了确认的证据。
工作流典型应用:
1.关键业务流程:订单、报价处理、采购处理、合同审核、客户电话处理、供应链管理等。
2.行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。
3.人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。
4.财务相关类:付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。
5.客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。
6.特殊服务类:ISO系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等各种通过表单逐步手工流转完成的任务均可应用工作流软件自动规范地实施。
工作流常见名称:
第一次接触工作流系统,可能会对一些基本的术语和名词有误解。如流程实例,流程模版,流程版本等,以及这些名词之间的关系,需要有一个学习和理解的过程。这些名词和术语也是工作流系统中的通用名词,通过学习和理解后,会对这些术语和名词有一个共同的认识和理解。
如下面的词语
工作流引擎:抽象的业务流程设计模型,负责业务流程的定义,解释和运转。
工作流模版:用工作流引擎的基本概念和路由过程表示出一个业务办理过程,这个过程通常是用xml格式的文件来记录的,这个xml文件,就是工作流模版,也可以说是流程模版。
工作流名称:就是工作流模版文件的名称。也可以叫流程名称。
工作流版本:工作流模版的版本,也可以叫流程版本。在工作流系统中,对工作流模版有个版本管理,新建一个工作流模版时候,它的工作流模版是.1。当再次做修改的时候,可以选择创建新的版本,如.2。
因为一旦业务流程模版投入使用了,有了运行的流程实例了,再次对业务流程做的修改,就需要更新到新的版本中,原来的流程版本还需要存在,原来的流程定义信息,按版本仍然能查询到。新的修改在新的版本中。
流程名称+流程版本 是唯一标识一个业务流程的。
工作流建模:利用流程设计器将业务处理过程用工作流的节点方式表示出来,就是工作流建模,也可以说是流程建模。
工作流节点:是工作流引擎的设计基本节点,一个节点表示一个业务处理过程,在流程设计器中,会有相应的表示方式。
流程实例:按照工作流模版定义的处理过程启动运行的业务处理过程,即流程实例。利用建立好的业务流程模版,可以多次启动流程实例,一个流程实例即一个业务处理过程。如请假审批的流程,张三填写他的请假单,启动一个审批流程实例。李四也填写一个自己的清单单,也是启动了一条流程实例。
流程实例id:每条启动的流程实例,在工作流引擎中,都会对应一个流程实例id,来唯一标识这条流程实例。
轨迹id: 轨迹id通常是指流程节点的运行轨迹id,当一个节点在流程实例中被反复运行的时候(如循环路由,自由流),每次到达这个节点的时候,都会产生一个轨迹 id,trace_id, 唯一标识这次的运行轨迹。
业务数据: 流程中每个节点上处理的业务记录等。通常流程数据和业务数据是有关联的。
流程设计器:利用工作流引擎的设计基本节点和概念给业务流程建模的可视化编辑工具,就是流程设计器。
当前步骤:流程实例未结束前,正运行到的当前节点,为当前步骤。
历史步骤:流程实例运行完成的节点,都认为是历史步骤。
流程实例运行轨迹:每条流程实例在工作流模版的节点上运行的轨迹。
流程实例监控:监控每个流程实例在各个节点的运行情况。
任务:每条流程实例在运行到流程的各个节点时,会产生一些待执行的任务信息。有任务名称,描述,和参与人,完成人等任务的基本信息。通过任务链接到待处理的业务过程。
任务参与人:任务信息的参与人,能够查看到任务的相关人。
任务执行人:可执行任务的操作人。
任务工单:任务派发下来的工单。
串行路由:业务建模中,节点按顺序一个一个的往后串联的方式。
并行路由:业务建模中,节点并行的方式往后链接。
条件路由:业务建模中,按设置的条件为真,链接一个路由方式,条件为false,往后链接一个路由方式。在流程实例运行时,只会执行一条路由,即条件要么=true,要么=false.
分支:业务建模中,平行分支的节点路由方式。
合并:业务建模中,将平行分支的节点路由再合并起来的路由方式。
子流程:为一个独立的业务流程,嵌入到主流程中。
循环路由:在节点间或同一个节点上循环执行的路由方式。
自由流:流程实例不按照流程模版中预定义好的节点顺序往下执行,而是可以自由的跳转。
回退流:流程实例不按照流程模版中预定义好的节点顺序往下执行,而是回退到曾经运行过的任意节点上。
业务补偿类:在流程发生自由跳转的时候,需要辅助执行一些业务处理过程来对业务数据进行修改。
这里只是列出一些常用的工作流系统中的术语,不体现流程引擎的设计基本概念。
特别是流程模版,流程实例,业务数据这之间的关联和区别:
流程模版,是将业务处理过程用工作流引擎的支持的方式表示出来的一个模版文件。
流程实例,按照工作流模版定义的处理过程启动并运行的业务处理过程,通常对应一条主业务数据。一条流程实例在流程引擎中会有一个唯一的流程实例id,通常命名为wf_id,在业务数据的主业务表中,也需要建立一个wf_id字段,来和流程实例关联上。
例如请假审批的流程,请假单,就是业务主表。报销单,报销单的主表,就是业务主表。
根据需要,可能在业务表中,还可能会增加轨迹id字段,来进一步控制业务数据与工作流数据的关联。











