如何優化你的PowerBuilder程序_第1頁
如何優化你的PowerBuilder程序_第2頁
如何優化你的PowerBuilder程序_第3頁
如何優化你的PowerBuilder程序_第4頁
如何優化你的PowerBuilder程序_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、如何優化你的PowerBuilder程序PowerBuilder是快速有效的開發工具,在程序實現過程靈活多樣,下面介紹一下在開發高校產品過程中積累的一些經驗。一、處理 SQL 語句1、緩沖 SQL 語句        在應用程序中,有時需要反復調用同一組 SQL語句,在這種情況下,可以通過在應用中為這些 SQL 建立緩沖區來提高執行性能。         &

2、#160; 在缺省情況下,SQL 語句的緩沖區是關閉的,你可以通過如下語句打開它:                            SQLCACHE = n          

3、;n 表示裝入緩沖區的 SQL 語句數量(缺省為0)。    例如:   dw_1.SetTransObject(sqlca)    SQLCA.dbParm = "SQLCache = 0"    dw_1.retrieve()        如果將上例的 "

4、;SQLCache = 0" 改為 "SQLCache = 25",此句的執行效率將提高五分之一左右。但應注意緩沖區的大小,否則也將影響程序執行的性能。    注:此方法對用 ODBC 和 orACLE 連接的數據庫非常有效。2、捆綁變量    請看下例:   SQLCA.DBPARM = "DISABLEBIND=1"

5、;    Insert INTO DA_DH valueS("1","河南0")    Insert INTO DA_DH valueS("2","河南1")    Insert INTO DA_DH valueS("3","河南2")   

6、; Insert INTO DA_DH valueS("4","河南3")    Insert INTO DA_DH valueS("5","河南4")    Insert INTO DA_DH valueS("6","河南5")      

7、;  這里未使用捆綁變量,在插入是 PB 將重新處理每個帶有    新值的SQL語句。如果將上例改為:    SQLCA.DBPARM = "DISABLEBIND=0"    Insert INTO DA_DH valueS("1","河南0")    Insert INTO&

8、#160;DA_DH valueS("2","河南1")    Insert INTO DA_DH valueS("3","河南2")    Insert INTO DA_DH valueS("4","河南3")    Insert INTO DA_DH va

9、lueS("5","河南4")    Insert INTO DA_DH valueS("6","河南5")    則系統將把 Insert 語句按如下格式進行處理:        Insert INTO DA_DH valueS(?,?)   &#

10、160;其中 "?" 稱為占位符。系統性能將有所增強。3、用數據窗口代替 SQL 語句通常,為了獲得某些數據,采用數據窗口和 SQL 語句都是可行的,但是PB 對數據窗口和 SQL 語句采用不同的處理機制,因此,具有不同的效率。例:為里檢索電話檔案中的用戶名,可以利用 SQL 語句,將所有的數據檢索到一個多行編輯中,也可以檢索到一個數據窗口中。如果使用第一中方法:首先定義一個游標:    DECLARE CUR

11、60;CURSOR FOR    Select "DA_DH"."HM"    FROM "DA_DH"然后可以:    STRING stxt,st    int li        open cur   &

12、#160;do li = li + 1        fetch cur        into :stxtli         st=st+stxtli + "rn"    loop wh

13、ile stxtli""    close cur;    mle_1.txt = st也可以使用第二種方法:    dw_1.settransobject(sqlca)    dw_1.retrieve()    利用 POWERBUILDER PROFILER 工具進行檢查,對比兩種方法所需時間如下方法&

14、#160;                    所需時間 (百分之一秒)SQL 語句   100.9857數據窗口              49.0133由于數據窗口或DATASTORE 使用了標

15、準的內嵌的代碼,而不是有開發人員進行全部編碼,同時編譯執行的速度比解釋執行的速度快的多,因此在開發過程中應盡量使用數據窗口和DATASTORE.    即使是必須用SQL 語句的時候,也應該盡量將它們定義為存儲過程(特別是在多用戶的環境中),以提高應用程序的性能.二、數據窗口的編程和執行數據窗口是PB最值得被稱道的, 其具有如下特點:1. 多種顯示方式.2. 多種編輯方式.3. 使用方法簡單.4. 具有多種報表形式.5. 可實現屏幕滾動.6. 可實現數據的有效性校驗.7.&#

16、160;執行性能顯著提高.8. 編程工作變少.9. 可以在數據窗口內部實現數據哭的更新.下面, 我將介紹一些用于提高數據窗口性能的技術.1. 減少連接數據庫的次數連庫操作是非常影響執行速度的操作. 因此在程序中,一旦與數據庫連接后就應當盡量保持與數據庫的連接, 減少連接數據庫的次數.PowerBuilder 提供里兩個函數來建立數據窗口與事務對象的連接:        SetTrans()     

17、;   SetTransObject()在程序中應當盡量使用 SETTRANSOBJECT(), 因為SETTRANS() 函數在每次調用 RETRIEVE(), Update() 等函數之后, 都要執行數據庫的連接和斷開操作.2. 下拉數據窗口與表的連接    對于數據庫服務器來說, 表的連接操作是一項非常大的開銷, 而 POWERBUILDER 提供的下拉數據窗口在某些情況下可以代替表的連接操作.例如,

18、 為了在數據窗口上顯示用戶的電話號碼和姓名:如果用表的連接的方法, 數據窗口對應的 SQL 語句應是這樣的:        Select "DA_DH"."DHHM",                "DA_HTH"."DWM"&

19、#160;       FROM "DA_HTH",        "DA_DH"        Where ("DA_HTH"."DHHM"="DA_DH"."DHHM")同樣的程序可用下拉數據窗口來完成, 這里不再具

20、體介紹.但是, 應當注意, 以上兩種方法究竟哪一種數據更快, 與表的結構, 表的數量, 連接的方法等均有關系, 應當具體分析.3. 共享數據在一個應用程序中, 某些數據需要頻繁的使用, 如果在每次使用時都從數據庫中進行檢索, 則需占用大量的服務器資源和網絡資源. 為了減少開銷, 可以在客戶端對這些數據只進行一次檢索, 然后允許其它任務共享這些數據.例如, 如果有兩個數據窗口, 都需要從第三方表中檢索出用戶的電話號碼, 且此列用下拉數據窗

21、口給出. 如果每次都對電話號碼進行檢索, 則性能較低. 因此, 可以單獨建立一個關于電話號碼的數據窗口. 在每次打開窗口時, 首先將電話號碼檢索到此數據窗口中, 然后另外兩個數據窗口中關于電話號碼的下拉數據窗口可以共享此數據窗口中的數據.在窗口的 OPEN 事件中編寫如下程序:        dw_1.settransobject(sqlca)       

22、 dw_2.settransobject(sqlca)        dw_3.settransobject(sqlca)        / 檢索 dw_1        dw_1.retrieve()        / 使 DW

23、_2 的下拉數據窗口共享 DW_1        datawindowchild child1        dw_2.getchild('dhhm',child1)        child1.settransobject(sqlca)      &#

24、160; dw_1.sharedata(child1)        / 使 DW_3 的下拉數據窗口共享 DW_1        datawindowchild child2        dw_3.getchild('dhhm',child2)   

25、     child2.settransobject(sqlca)        dw_1.sharedata(child2)使用這種方法, 避免了各個數據窗口間物理的拷貝數據, 因此減少了空間上的開銷,提高了應用程序的綜合性能.4. 數據窗口間數據的拷貝如果需要在數據窗口間共享數據, 應當盡量使用 SHAREDATA() 函數, 但是,SHAREDATA() 函數并不是物理地在數據窗口

26、間拷貝數據, 如果在顯示數據的同時, 還要對數據進行操作, 則需要進行數據的拷貝.例如, 要求將 DW_1 中選定的行拷貝到 DW_2 中:    在窗口的 OPEN 事件中編程:        dw_1.settransobject(sqlca)        dw_2.settransobjec

27、t(sqlca)        dw_1.retrieve()    在數據窗口 DW_1 的 ROWFOCUSCHANGED 事件中編寫下列程序:        long lr        lr = dw_1.selectrow(0,false)

28、        lr = dw_1.getrow()        lr = dw_1.selectrow(lr,true)要完成從 DW_1 到 DW_2 的拷貝工作, 有兩種方法:第一種:在按鈕 "拷貝" 的 CLICKED 事件中編程long lrlr =

29、0;dw_1.getselectedrow(0)dw_1.rowscopy(lr,lr,primary!,dw_2,100,primary!)執行程序, 利用 POWERBUILDER PROFILER 得出所需時間為 1.7034(百分之一秒)第二種:在按鈕 "拷貝" 的 CLICKED 事件中編程dw_2.object.data = da_1.object.data.selected執行程序, 利用 POWERBUILDER PRO

30、FILER 得出所需時間為 0.8062(百分之一秒)5. 數據窗口屬性的訪問和修改A. 數據窗口屬性的訪問    在程序中訪問數據窗口的屬性有下列幾種方法:    A1. 采用點表達式訪問    A2. 應用多個獨立的 DESCRIBE() 函數訪問    A3. 只使用一個 DESCRIBE() 函數, 采用復合參

31、數訪問多個屬性上面三中方法, 通常第一種方法最慢, 第三種方法最快.例如:    在窗口的 OPEN 事件中    DW_1.SETTRANSOBJECT(SQLCA)    DW_1.RETRIEVE()第一種方法:在檢索按鈕的 CLICKED 事件中編程.    string dx, dy, dh, dw  

32、60; dx = dw_1.object.da_dh.x    dy = dw_1.object.da_dh.y    dx = dw_1.object.da_dh.height    dy = dw_1.object.da_dh.width    st_1.text =dx+","+dy+","+

33、dh+","+dw第二種方法:    string dx, dy, dh, dw    dx=dw_1.describe("da_dh.x")    dx=dw_1.describe("da_dh.y")    dx=dw_1.describe("da_dh.height")   

34、0;dx=dw_1.describe("da_dh.width")    st_1.text =dx+","+dy+","+dh+","+dw第三種方法:    string dx, dy, dh, dw    st_1.text=dw_1.describe("da_dh.x" +&  &#

35、160;                         "da_dh.y" +&                   &

36、#160;        "da_dh.height" +&                            "da_dh.width")實驗證明, 第三種方法的速度

37、是最快的. 但是程序的可讀性最差.B. 數據窗口屬性的修改在程序中修改數據窗口的屬性有下列幾種方法:    A1. 采用點表達式修改    A2. 應用多個獨立的 MODIFY() 函數訪問    A3. 只使用一個 MODIFY() 函數, 采用復合參數訪問多個屬性上面三中方法, 通常第一種方法最慢, 第三種方法最快.例如:  

38、0; 在窗口的 OPEN 事件中    DW_1.SETTRANSOBJECT(SQLCA)    DW_1.RETRIEVE()第一種方法:在檢索按鈕的 CLICKED 事件中編程.    DW_1.SETREDRAW(FALSE)    dw_1.object.da_dh.x = 18    dw_1.object.da_d

39、h.y = 16    dw_1.object.da_dh.height = 100    dw_1.object.da_dh.width = 200    DW_1.setredraw(true)    st_1.text =dx+","+dy+","+dh+","+dw第二種方法:  

40、  DW_1.SETREDRAW(FALSE)    dw_1.modify("da_dh.x = 18")    dw_1.modify("da_dh.y = 16")    dw_1.modify("da_dh.height = 100")    dw_1.modify("da_dh.

41、width = 200")    dw_1.setredraw(true)第三種方法:    dw_1.modify("da_dh.x=18" +&                "da_dh.y=16" +&   

42、0;            "da_dh.height=100" +&                "da_dh.width=200")實驗證明, 第三種方法的速度是最快的. 但是程序的可讀性最差.注意, 在方法一和方法二中,&#

43、160;都使用的 setredraw() 函數以減少屏幕的重繪, 否則, 執行速度將嚴重下降.6. 數據窗口中數據的訪問在程序中, 經常會需要動態的修改數據窗口中的數據. 對此, PB提供了多種方法, 各種方法在性能上會有一些差異.A. 數據窗口中數據的訪問    目的: 將數據窗口中的電話號碼存放在一個數組中.    請比較下面兩中方法.    方法一: 

44、   string da_dh    long ll,i    ll = dw_1.rowcount()    for i = ll to 1 stet -1    da_dhi = dw_1.getitemstring(i,"dhhm") 

45、0;  next    方法二:    string da_dh    da_dh = dw_1.object.dhhm.current測試發現, 第二種方法比第一種方法快將近一倍. 數據量越大這種差異越明顯.B. 數據窗口中數據的修改    目的: 修改數據窗口中的電話號碼列的值.    請比較下面兩中方法

46、.    方法一:    dw_1.setitem(i,"dhhm",l_name)    方法二:    dw_1.i = l_name測試發現, 第二種方法比第一種方法快將近一倍. 數據量越大這種差異越明顯.7. 數據窗口事件對性能的影響對于數據窗口控制中經常發生的事件, 應當盡量減少其中的程序代碼.特別是如下事件:    A. itemchanged    b. editchanged    c. itemfo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論