知识管理系统Data Solution研发日记之四 片段式数据解决方案

知识管理系统Data Solution已经写了三篇文档,如果你错过了这些基础的知识,可以通过下面的连接到到它们

知识管理系统Data Solution研发日记之一 场景设计与需求列出

知识管理系统Data Solution研发日记之二 应用程序系列

知识管理系统Data Solution研发日记之三 文档解决方案

这一篇文章专注片段式的数据,也可称之为结构化的数据。比如,我们存放到SQL Server中的表,采购单和销售单就是结构化的数据,它们的字段因功能的不同有所不同,对这种方式的数据处理,不同于文档处理,需要另找方案。

片段式的数据来源,以Rule Editor规则编辑器实现,请看下图

image

是的,这就是一个基于正则表达式的互联网数据抓取程序,在这里定义好规则,然后在后台程序中分析这个规则,进行数据的抓取工作。一般的,会根据规则的不同,产生的字段也不同

image

如上图所示,有几条规则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这个工具来练习正则表达式,会让文字搜索与匹配工作变得轻松很多。

image

我正是以这个工具为基础,设计了抓取无忧人才,IT公司速查的正则表达表,再让后台程序解析规则,抓取数据。

 

关于规则数据的存储方案,则费了一些周折。一开始的首选方案是Microsoft Access,一个小文件,不需要安装任何软件。但是,在部署到X64系统中发现,未在本机计算机上注册Microsft.Jet.OLEDB.4.0提供程序,找不到workaround方法可以绕开Access 在X64上的限制,微软提供的的办法也是让编译器编译成X86平台,而不要编译成Any CPU,这已经很恼火了,再加上Access系列的宏的原因,彻底放弃了Access作为文件型数据库存储方案的选择。转而在网上搜索,发现Db4o这个面向对象的数据库,最新的版本提供对Visual Studio 2010的支持,管理工具以插件放到VS2010中。

image

在管方网站下载连接中,一个安装包中,包含部署时的程序集文件,Sample和文档,做的非常专业,一般.NET程序员在半个小时内,就可以快速入门,照葫芦化瓢,一下子就解决了规则文件的存储问题。

 

下一步动作,就是如何展示这些结构化的数据,目标之一就是要创造一个无代码的环境,不需要写代码就可以读取,编辑这些结构化的数据。打开窗体设计器,设计数据读取窗体,我这里以采购单为例子

image

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)

image

打开Data Loader程序,执行Segment Explorer组件,打开主窗体

image

点击Purchase Order按钮,可以看到主从表数据,已经显示到了窗体中

image

这就是数据展现的全部,没有任何的编码行为,非IT的人员,完全可以独立完成。

在这一步,我隐藏了很多的细节,有以下几个重要的关键点,需要说明一下

1.  窗体设计器生成窗体代码,它就好比是一个代码生成器,我依照它提供的组件,生成源代码。对一个单一表,比如IT公司表,Company,在生成源代码时,会要求提供连接字符串,系统是根据这个连接字符串,进入到数据库中,然后以FlexDataTable的组件名称,获取表的定义,并且绑定到BindingSource中。

image

2.  窗体定义格式以XML格式存储,在以前的文章中,我提到过一篇基于XML的窗体设计器的管理系统,它的界面效果是这样的,文章是《基于窗体设计器的企业管理软件开发工具》

image

当时对这种软件开发方式有浓厚的兴趣,后来经过转做ASP.NET Web开发后,一直搁置。现在把这种方法重新检起来,算是一种温故而知新。孔子的这句话,是很有道理。对以前学习过的技术,反思,再运用,会有新的发现。

 

再来看一下零代码的,ASP.NET Web方式的数据展现方案,创建ASP.NET Web Application

image

添加SqlDataSource和GridView,设置GridView的数据源为SqlDataSource,运行这个页面,数据就自动提取到网页中

image

如果要编辑数据,可以做成细化的FormView来展现数据。这个方案也不需要任何编程,以Web方式展现数据。

 

经过这么多努力,我已经解决了片段式(Segment)数据的搜索,下载,再到展现出来。因为照顾到了全局,细节方面还要细化,做精细。比如,数据采集方面,网上流行的火车头就是非常好的选择。而且它提供了Express免费版,这样即可以阻止被破解的可能性,也可以推广自己的软件,一举两得。
数据的展现,我以为这里的方法,为最简单方便,不需要编码。

posted @ 2011-10-25 16:47  信息化建设  阅读(2084)  评论(1编辑  收藏  举报