pb11+webservice开发分布式三层应用.docx
- 文档编号:4643008
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:20
- 大小:1MB
pb11+webservice开发分布式三层应用.docx
《pb11+webservice开发分布式三层应用.docx》由会员分享,可在线阅读,更多相关《pb11+webservice开发分布式三层应用.docx(20页珍藏版)》请在冰豆网上搜索。
pb11+webservice开发分布式三层应用
pb11+webservice开发分布式三层应用
一、WEBSERVICE服务端的开发
1、新建立一个workspace工作区
先择FILE菜单下的NEW,新建一个工作区。
点击后出现下图
在文件名处输入工作区的名称,假设我们的工作区名为webserver,单击保存按钮。
这样工作区就建立成功了。
2、建立一个.netwebservice应用
点击FILE菜单下的NEW
选中.netwebservice点击ok按钮
点击next按钮
点击next按钮
这里我们不修改pbl库名,当然你可以按你的意思修改库名,点击next按钮。
一直点next按钮直到出现
这里需要注意一点,如果你当前的IIS端口,不是默认的80,那么在localhost后面要加上
“:
81”,假设你的端口号是81的话。
再点击一次next直到finish按钮。
3、连接数据库
我们先来建立一个数据库的连接以为后期的webservice服务提供一个连接。
打开系统生成的n_webservice对像
在里面写上
//ProfileEASDemoDBV110
SQLCA.DBMS="ODBC"
SQLCA.AutoCommit=False
SQLCA.DBParm="ConnectString='DSN=EASDemoDBV110;UID=dba;PWD=sql'"
我是拷贝了,安装PB11默认的安装的ASA数据库,这里你可以修改成你的数据库连接参数。
数据库建立完成后,我们再建立一个ue_retrieve的方法用来提取数据库数据
1、在N_webservice对像里创建立一个名为DS1的数据存储datastore
2、在DS1的dberror里面写上
ls_err_a=sqlerrtext////////
注意:
将ls_err_a定义为一个实例变量,如果你看不清楚出入参定义可以将本图片另存放大就可以看到了。
////////////////////////////////////////////////////////////////////////////
//用于取单一的数据窗口blob值//
////
//将数据窗口检索到blob,并将blob返到客户端//
////
//guoac//
////
//入参ls_syntax--传入一个字符串的数据窗口对像语法用于重构数窗//
//入参ls_sql传入一个条件字符串,用于附加where条件////
//出参dwo_blob传出一个存储数据窗口对像的blob//
////
//dwo_blob回传参数//
////////////////////////////////////////////////////////////////////////////
longll_row,ll_returnrow
stringls_returnmodiy
stringls_oldsql,ls_newsql,ls_error
stringcsa
inti,LI_WHERE
connect;
ifSQLCA.SQLCode<>0then
as_returnerr="连接数据库出错,请检查数据库连接参数。
"+string(sqlca.sqlerrtext)
return-1////创建数据窗口出错
endif
ifds1.create(as_syntax,ls_error)<>1then
disconnectusingsqlca;
as_returnerr="服务端重建数据窗口出错!
"+ls_error
return-1////创建数据窗口出错
endif
intli_a
li_a=ds1.settransobject(sqlca)
ifli_a<>1then
disconnectusingsqlca;
as_returnerr="服务端设置数据存储事务出错!
"
return-1///设置对像事物出错
endif
ls_oldsql=ds1.getsqlselect()
iftrim(ls_oldsql)=''orisnull(trim(ls_oldsql))then
disconnectusingsqlca;
as_returnerr="传入的数据窗口对像sql语法为空!
"
return-1//取新窗口语法出错
endif
LI_WHERE=pos(UPPER(ls_oldsql),'WHERE',1)
IFLI_WHERE=0THEN
ls_oldsql=ls_oldsql+"WHERE1=1"
ENDIF
ls_newsql=ls_oldsql+''+as_sql
iftrim(ls_newsql)=''orisnull(trim(ls_newsql))then
disconnectusingsqlca;
as_returnerr="连结后的sql语法为空!
请检查传入的数据窗口对像sql语法。
"
return-1//取新窗口语法出错
endif
ifMatch(ls_newsql,'"')then
disconnectusingsqlca;
as_returnerr="重组后的sql语法出错,数据窗口语法不能包含双引号!
"+ls_newsql
return-1//设置新窗口语法出错
elseifnotMatch(upper(ls_newsql),"WHERE")then
disconnectusingsqlca;
as_returnerr="重组后的sql语法出错,数据窗口必须包含一个where条件"+ls_newsql
return-1//设置新窗口语法出错
endif
ifds1.modify('DataWindow.Table.Select="'+ls_newsql+'"')<>""then
disconnectusingsqlca;
as_returnerr="重组后的sql语法出错,请检查数据窗口对像SQL语法。
"+ls_newsql
return-1//设置新窗口语法出错
endif
ll_row=ds1.retrieve()
ifll_row<0orisnull(ll_row)then
disconnectusingsqlca;
as_returnerr="数据检索出错!
"+ls_err_a+ls_newsql
return-1//服务端检索数据出错
endif
ifds1.modify('DataWindow.Table.Select="'+ls_oldsql+'"')<>""then
disconnectusingsqlca;
as_returnerr="还原旧数据窗口语法出错,请检查数据窗口对像语法是否含有双引号。
"+ls_oldsql
return-1//还原旧数据窗口语法出错
endif
ll_returnrow=ds1.getfullstate(dwo_blob)
ifll_returnrow<0orisnull(ll_returnrow)then
disconnectusingsqlca;
as_returnerr="服务端进行blob时,获取数据行出错!
"
return-1//封装到blob变量时出错
endif
disconnectusingsqlca;
destroyds1;
as_returnerr="数据检索成功!
"
//destroyn_webservice
returnll_returnrow
3、把服务端发布到IIS服务
打开我们的P_webservice_webservice编译object。
点击编译,pb11会自动将webservice发布到我们原来定义的IIS服务器上
发布的时候要注意一点就是在objects选项卡上,必须先中我们上面的函数(或者叫方法),librarylist选项卡上要选上我们的pbl库文件。
点击第一辆小车deployproject其它就交给pb自已去完成了。
4、编译完成后run一下我们的webservice看看是否发布成功,
出现上图并能看到我们定义的函数(我总是喜欢叫它们方法),webservice就算是发布成功了。
这样我们就完成了一个服务端检索方法。
下一节我们接着继续讲解如何用客户端检索数据。
二、客户端调用webservice
1、建立一个PB应用
点击确定后
点击finish完成
2、给工程附加pbsoapclient110.pbd
这个文件通常在pb11的安装目录里,可以通过搜索找到它,然后将这个文件拷贝到我们新建应用的目录下,并附加到工程里面来。
3、为应用添加一个webserviceproxy
函数添加完成后在工程里面添加一个窗口,我们来实验一下我们前面的工作
注意:
应用程序要与webservice通讯都要通过webserviceproxy来完成,所以我们首先要建立一个proxy
Ok后
这里的wsdlfilename
如果你记不住就打开webservice端,工程文件的object项上面去找
然后一直下一步到下图
写上一个proxyname我写的是myproxy
一直到下一步完成。
打开我们刚才定义的代理,并编译,顺利的话会看到库文件中添加了很多结构,这些我们都不用管,接着做我们后面的工作就好。
4、新建一个customclass
5、给新建立的对像添加一个函数
这个函数就是代替二层开发模式下的retrieve函数的,这里你可以将这个函数多次重载以方便前台开发人员调用,目前这个函数支持给窗口添加where条件,检索并返回错误或成功的信息。
以及返回检索到的行数。
还是不太明白的可以加我的QQ:
47570471,我的文笔从上幼儿园开始就不是强项,估计说得也不是太明白,不过欢迎大家QQ骚扰。
总之就是重载到前端开发人员分不出是在开发二层还是三层就算ok了,见下图:
为对像添加二个实例变量
SoapConnectioni_conn
myproxyn_webservicesoappb_soap////myproxyn_webservicesoap这个名称如果你前面建立代理的时候用的是myproxy那应该就是这个,如果不是就去找你生成的代理对像名称。
Constructor事件里面写上
i_conn=createSoapConnection
//i_conn.setsoaplogfile("mis.log")
i_conn.createinstance(pb_soap,"myproxyn_webservicesoap")
destructor事件里面写上
destroypb_soap;
destroyi_conn;
对像到这里建立完成。
1、给应用添加一个全局变量
soapservermis
注意:
soapserver为上面定义的对像的名称。
在窗口的open事件里面上
mis=createsoapserver
2、做一个数据窗口(这个不用说了吧)
3、把数据窗口拖到我们的测试窗体
4、拖一个commandbutton
里面写上:
mis.retrieve(dw_1)//////
如果数据检索到数据窗口了,那么我们本次的实验就算成功了。
下一节我们接着讲单数据窗口及多数据窗口的update
以及存储过程的调用及oracle序列的通用方法………
Guoacqq:
47570471
三、三层结构的更新
1、webservice端方法
新建立一个函数
intli_change=0
stringls_error=""
connect;
ifSQLCA.SQLCode<>0then
as_err_return="连接数据库出错,请检查数据库连接参数。
"
return-1////创建数据窗口出错
endif
ifds1.create(as_syntax,ls_error)<>1then
disconnectusingsqlca;
as_err_return="服务端重建数据窗口出错,请检查您传入的数据窗口对像!
"+ls_error
return-1
endif
ifds1.settransobject(sqlca)<>1then
disconnectusingsqlca;
as_err_return="服务端设置数据存储事务出错!
"+ls_err_a
return-1
endif
li_change=ds1.SetChanges(dwo_object)
ifli_change=1then
ifds1.Update()=1then
commitusingsqlca;
disconnectusingsqlca;
as_err_return="数据更新成功!
"
return1
else
as_err_return=ls_err_a
rollbackusingsqlca;
disconnectusingsqlca;
return-1
endif
else
disconnectusingsqlca;
as_err_return="取更新行封装到blob时出错!
"
return-1
endif
2、前端更新方法
建立的方法见前面,RETRIEVE的方法,这里我们建立一个update函数
intli_return,li_dwreturn
longll_rv
stringls_syntax
bloblblb_data
as_dwoname.accepttext()
li_dwreturn=as_dwoname.GetChanges(lblb_data)
ifli_dwreturn=0then
as_err_return='客户端数据窗口没有需要更新的数据。
'
return1
endif
ifli_dwreturn=-1then
as_err_return="客户端取数据窗口变更封装到blob时出错。
"
return-1
endif
ls_syntax=as_dwoname.describe('datawindow.syntax')
ifls_syntax=''orls_syntax=""then
as_err_return="客户端数据窗口语法为空。
"
return-1
endif
ifMIS.uf_update(lblb_data,ls_syntax,as_err_return)=1then
as_dwoname.ResetUpdate()
return1
else
return-1
endif
近期因为项目的原因,可能没什么时候来整理这个文档了,只能先写到这里,如果有什么问题可以给我留言。
另外关于多数窗的更新问题,我希望大家也能自已动手去试一下,方法就是传入一个数据窗口数组到WEBSERVICE,WEBSERVICE端进行多表多更的事务控制。
PB11+WEBSERVICE+WINFROM应用方式是我们目前一个大型系统的开发模式。
这样模式只需要发布WINFROM到IIS后,客户端就不需要安装任何技撑的东西,对于以后版本的的更新也由PB全自动管理。
让PB的开发模式发生了很大的改变。
另正式应用过程中还会涉及到应用服务器集群及数据库连接池的问题,不然每一次检索或更新都要连接数据库,可能谁都认为这不是个好的解决方案。
更多需要优化及相关的领域的有待大家去研究。
也希望有更多的人回到PB的开发阵营,呵,最起码招人的选择更多一些!
开个玩笑。
另外在项目中可能还会有比如二层模式下通用查询,子数据窗口检索,存储过程通用方法等一些问题。
希望有更多的人来研究这些东西。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pb11 webservice 开发 分布式 三层 应用