知识管理系统Data Solution研发日记之四 片段式数据解决方案
知识管理系统Data Solution已经写了三篇文档,如果你错过了这些基础的知识,可以通过下面的连接到到它们
知识管理系统Data Solution研发日记之一 场景设计与需求列出
知识管理系统Data Solution研发日记之二 应用程序系列
知识管理系统Data Solution研发日记之三 文档解决方案
这一篇文章专注片段式的数据,也可称之为结构化的数据。比如,我们存放到SQL Server中的表,采购单和销售单就是结构化的数据,它们的字段因功能的不同有所不同,对这种方式的数据处理,不同于文档处理,需要另找方案。
片段式的数据来源,以Rule Editor规则编辑器实现,请看下图
是的,这就是一个基于正则表达式的互联网数据抓取程序,在这里定义好规则,然后在后台程序中分析这个规则,进行数据的抓取工作。一般的,会根据规则的不同,产生的字段也不同
如上图所示,有几条规则Rule,就会在数据库中产生几个数据库字段,以存放用这个规则的抓取到的数据。在运行时,它会先创建表结构,创建数据库字段,然后把抓取到的数据依次放进来。使用规则创建对应的SQL Server表和字段,使用的是微软的Microsoft.Practices Enterprise Library。这个强大的工具,在2.0时就很流行,我对它进行简化重写,用下面的一句代码来指定连接字符串,以根据不同的情形,连接到不同的数据库。微软提供的办法是在配置文件的ConnectionString节点,但是这个办法并不总是有效果。比如,要连接到多个数据库,非得要依照动态赋值的方式设置连接字符串。代码参考如下
EnterpriseLibraryShared.ConnectonString = "server=(local);database=Northwind;uid=sa;pwd=holiday"; Database m_commonDb; string SQLGet_ShiftCodeList = @"select * from dbo.Customers "; m_commonDb = DatabaseFactory.CreateDatabase(); DbCommand cmd = m_commonDb.GetSqlStringCommand(SQLGet_ShiftCodeList); DataSet dsShiftCode = m_commonDb.ExecuteDataSet(cmd); int count = dsShiftCode.Tables[0].Rows.Count;
这样可以抛开配置文件的烦恼,在程序入口的地方,设置连接字符串。你知道的,对于Editor,Form Designer这样程序,给它强加一个配置文件,并不是很合理,因为它们天生就不知道数据库的存在。
设计规则,大部分的时间就是在和正则表达式做搏斗,对它理解的越深刻,写出的搜索语句就越简单,数据的准确率也越高,系统已经写好了,留下的开放接口就是正则表达式,依照正则式不同,从成千上万的网页中,抓取所需要的数据。
推荐你使用Expresso这个工具来练习正则表达式,会让文字搜索与匹配工作变得轻松很多。
我正是以这个工具为基础,设计了抓取无忧人才,IT公司速查的正则表达表,再让后台程序解析规则,抓取数据。
关于规则数据的存储方案,则费了一些周折。一开始的首选方案是Microsoft Access,一个小文件,不需要安装任何软件。但是,在部署到X64系统中发现,未在本机计算机上注册Microsft.Jet.OLEDB.4.0提供程序,找不到workaround方法可以绕开Access 在X64上的限制,微软提供的的办法也是让编译器编译成X86平台,而不要编译成Any CPU,这已经很恼火了,再加上Access系列的宏的原因,彻底放弃了Access作为文件型数据库存储方案的选择。转而在网上搜索,发现Db4o这个面向对象的数据库,最新的版本提供对Visual Studio 2010的支持,管理工具以插件放到VS2010中。
在管方网站下载连接中,一个安装包中,包含部署时的程序集文件,Sample和文档,做的非常专业,一般.NET程序员在半个小时内,就可以快速入门,照葫芦化瓢,一下子就解决了规则文件的存储问题。
下一步动作,就是如何展示这些结构化的数据,目标之一就是要创造一个无代码的环境,不需要写代码就可以读取,编辑这些结构化的数据。打开窗体设计器,设计数据读取窗体,我这里以采购单为例子
PUORDH和PUORDD是主从表,H是采购单表头,有采购单编码,供应商,D是明细表,有具体的采购的物料明细,数量
窗体中有四个组件,两个BindingSource,两个FlexDataTable,它们的设置如下
bsH.DataSource=DataSet, bsH.DataMemeber=PUORDH
bsD.DataSource=DataSet, bsD.DataMember=PUORDD
数据表FlexDataTable的SQL属性设置如下
PUORDH.SQL=SELECT * FROM PUORDH
PURODD.SQL=SELECT * FROM PUORDD
之后是窗体的控件数据绑定,Ref No.文档控件的的DataBinding属性设置为Text,!bsH,Order_No,表示是绑定bsH数据源的Order_No字段,绑定到它的Text属性中,其余的依此类推。
点击Debug,生成源代码,并编译程序集。下面来修改主界面,以调用这个窗体,打开主窗体定义文件MainForm.xml,添加按钮Purchase Order,并输入Click事件代码为=Open("PURCHASE",null)
打开Data Loader程序,执行Segment Explorer组件,打开主窗体
点击Purchase Order按钮,可以看到主从表数据,已经显示到了窗体中
这就是数据展现的全部,没有任何的编码行为,非IT的人员,完全可以独立完成。
在这一步,我隐藏了很多的细节,有以下几个重要的关键点,需要说明一下
1. 窗体设计器生成窗体代码,它就好比是一个代码生成器,我依照它提供的组件,生成源代码。对一个单一表,比如IT公司表,Company,在生成源代码时,会要求提供连接字符串,系统是根据这个连接字符串,进入到数据库中,然后以FlexDataTable的组件名称,获取表的定义,并且绑定到BindingSource中。
2. 窗体定义格式以XML格式存储,在以前的文章中,我提到过一篇基于XML的窗体设计器的管理系统,它的界面效果是这样的,文章是《基于窗体设计器的企业管理软件开发工具》
当时对这种软件开发方式有浓厚的兴趣,后来经过转做ASP.NET Web开发后,一直搁置。现在把这种方法重新检起来,算是一种温故而知新。孔子的这句话,是很有道理。对以前学习过的技术,反思,再运用,会有新的发现。
再来看一下零代码的,ASP.NET Web方式的数据展现方案,创建ASP.NET Web Application
添加SqlDataSource和GridView,设置GridView的数据源为SqlDataSource,运行这个页面,数据就自动提取到网页中
如果要编辑数据,可以做成细化的FormView来展现数据。这个方案也不需要任何编程,以Web方式展现数据。
经过这么多努力,我已经解决了片段式(Segment)数据的搜索,下载,再到展现出来。因为照顾到了全局,细节方面还要细化,做精细。比如,数据采集方面,网上流行的火车头就是非常好的选择。而且它提供了Express免费版,这样即可以阻止被破解的可能性,也可以推广自己的软件,一举两得。
数据的展现,我以为这里的方法,为最简单方便,不需要编码。