由于pb9.0对webservice支持不好,因此将程序升级到pb11.5下面是本人在升级过程中的一些体会,希望对大家有用:
pb11.5已经不再提供mss microsoft SQL SERVER数据库接口,取而代之的是SNC SQL Native Client接口和ole mimcrosoft ole db接口,因
SNC 需要安装专门的客户端比较麻烦,因此本人采用的是ole db数据接口连接到SQL Server 2000 。使用ole db接口时,本人刚开始的配置参数
是这样的:
a_transaction.DBMS = "OLE DB"
a_transaction.LogPass = "xxxxxx"
a_transaction.LogId = "sa"
a_transaction.AutoCommit = False
a_transaction.DBParm = "PROVIDER='SQLOLEDB',"+ "DATASOURCE='"+ls_server+"',"+"PROVIDERSTRING='database="+ls_database+"'"
结果出现两个严重问题,一个问题:凡是char类型的字段,从数据库检索出来后其未填充部分全部用空格代替而不是将其截短,另一个严重问
题就是死锁。后改为
a_transaction.DBMS = "OLE DB"
a_transaction.LogPass = "xxxxxx"
a_transaction.LogId = "sa"
a_transaction.AutoCommit = False
a_transaction.DBParm = "PROVIDER='SQLOLEDB',DATASOURCE='" + ls_server +
"',PROVIDERSTRING='DataTypeCompatibility=80;database=" + ls_database +
";"+"',TIMEOUT=160,OJSyntax='ANSI',PBTrimCharColumns='Yes',PBMaxBlobSize=102400­0,Recheck"
这两个问题都得到很好的解决,但感觉速度上还是要比mss microsoft SQL SERVER 接口慢
pb10就开始全面支持unicode因此在进行字符串处理方面一定要注意,在pb9.0本人有一个使用起来感觉很好的一个走纸控件,到pb11.5就发现
有问题,出问题的关键代码是这样的
blobedit(blob_form,73,char(0))
j=len(ac_formname)
m=1
for i=1 to j
m=blobedit(blob_new,m,blob(mid(ac_formname,i,1)))
m=blobedit(blob_new,m,char(0))
next
blobedit(blob_form,103,blob_new)
RegistrySet('HKEY_CURRENT_USER/Printers/DevModePerUser',str_printername, RegBinary!, blob_form)
后经分析发现在pb9.0 blobedit函数是通过ansi编码方式进行处理的,而在pb11.5 blobedit函数是通过unicode编码方式进行处理的,而
windows操作系统对这个注册键是进行unicode方式进行编码的,因此作者"小本鱼"在处理这段代码时都在每一个ansi字符后以char(0)字符进行
填充,以转化为unicode字符因此我们只需要将这段代码改为
blobedit(blob_form,73,Char(0))
j=Len(ac_formname)
m=1
for i=1 to j
m=blobedit(blob_new,m,blob(Mid(ac_formname,i,1)))
next
blobedit(blob_form,103,blob_new)
RegistrySet('HKEY_CURRENT_USER/Printers/DevModePerUser',str_printername, RegBinary!, blob_form)
问题就解决了。同时我们在pb11.5中使用字符串函数对字符串进行处理时要注意字符串的编码方式如:mid函数在ansi方式下就要使用midA而在
unicode 方式下就用mid或midw
另一个问题是filereadex函数的使用,我们知道fileread函数对超长文本的读取是要分批次读取的,现在用filereadex函数就可以一次性读取
整个文本了。
pb11.5关于游标
pb11.5的ole db数据接口方式对游标的支持,只支持向前读取,不支持向后读取即只支持fetch ,不支持(fetch prior,fetch first)
pb11.5关于外部函数的引用
比如 Function int rf_load_key_hex(long icdev,int mode,int sec,string nkey) Library "mwrf32.dll" alias for "rf_load_key_hex;Ansi"
如果你传入或返回的是 ansi字符则后面一定要加 ANSI
pb11.5 与webservice
一、webservice 的发布
本人在发布webservice时遇到了一些问题,花了一天时间才解决,发布webservice的前提是发布对象必需安装IIS服务,同时要安装dot net 2.0.50727以上版本,还要安装ASPAJAXExtSetup。
遇到的问题一、
这是由于iis服务器没有安装dot net 2.0.50727以上版本,从而不支持服务器扩展引起的,或者你发布的目录要他建一个默认程序,具体方法是,在iis服务器上点你发布的目录
,点属性 ,点创建,如图,执行权限改为脚本和可执行文件。
如果还不能解决,在控制台中进入C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 目录,输入aspnet_regiis.exe -u 先卸载掉asp.net 然后再aspnet_regiis.exe -i安装asp.net
问题二、打开webservice页面没有问题了,但调用webservice函数时却出现了问题。问题界面如下:
出现上术错误是由于没有找到动态支持库引起的,在powerbuilder runtime packager 中封装powerbuilder .net component支持库,在iis服务器中安装.安装后重启一下电脑,如果还出现这个问题,在系统环境中把路径后的"\"去掉。如"C:\Program Files\Sybase\Shared\PowerBuilder\",改为 C:\Program Files\Sybase\Shared\PowerBuilder,改后重启一下电脑。
问题三: 远程发布出现
出现 The RPC Server is unavailable错误。
出现这种错误,1种可能是发布对像服务器和本机的rpc服务没有启动。如果确认rpc服务启动了,在本机增加一个用户和iis服务器所在计算机的用户名密码相同就可以了。
问题四:没有安装 ASPAJAXExtSetup引起发布后不访问。安装ajax extensions 1.0就可以了。
问题五:pb11.5在发布webservice 出现 pbwsemit.exe 非法操作失败
这是由于你的程序所在路径含有中文的原因,将文件夹改为英文就可以了.
二、webservice 的引用
1、新建webservice对象
2、对象建成功后,定义变量
SoapConnection lsc_conn
mz_hzylservice1soap lproxy_obj
meddataservice lproxy_obj_db
SoapConnection lsc_conn_db
tns1__cardinfo str_cardinfo
3、实例化
String ls_proxy_name = "meddataservice"//生成的代理对象名称
// String ls_url = base_xtcs.hyip //web service url
// //
lsc_conn_db = Create SoapConnection
lsc_conn_db.SetOptions("SoapLog=~"soaplog.txt~"")
int li_ret, i
li_ret = lsc_conn_db.Createinstance(lproxy_obj_db,ls_proxy_name,base_xtcs.dbip)
If li_ret <> 0 Then
Return 0
else
return 1
End If
4、引用java编写的webservice时每个对象可能会多出一个前缀如:tns__ 。
初次使用,感觉pb11.5延续了pb9.0的稳定性,同时对webservice的支持出现了革命性的变化,非常值得称道
下面是本人用ole db接口方式方式,应用程序所包含的动态库:
ADVAPI32.DLL,atl71.dll,DBNETLIB.DLL,DBNMPNTW.DLL,EasySoap115.dll,ExPat115.dll,libeay32.dll,libjcc.dll,msadce.dll,msadcer.dll,
msdatl3.dll,msvcp71.dll,NTWDBLIB.DLL,ODBCBCP.DLL,oledb32.dll,oledb32r.dll,pbdpl115.DLL,PBDWE115.DLL,PBOLE115.DLL,PBSHR115.DLL
,PBVM115.DLL,SQLCTR80.DLL,SQLISAPI.DLL,sqloledb.dll,SQLSRV32.DLL,SQLUNIRL.DLL,ssleay32.dll,utils.dll