pb9.0升级到pb11.5的体会

来源:互联网 发布:淘宝店铺授权书模板 编辑:程序博客网 时间:2024/04/26 05:02

由于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延续了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