pb11呼叫webservice 回傳 dataset ,pb中any接收,怎樣取出接收的資料到datawindow中 急!急!
uj5u.com熱心網友回復:
直接用webservice作為資料源uj5u.com熱心網友回復:
Any已回傳Dataset xm元素的資料,請問怎樣可以已更快的方式讀取到Datawindow中?????uj5u.com熱心網友回復:
pb11以上的版本已經可以用webservice作業資料源來建資料視窗,這種方法最快速uj5u.com熱心網友回復:
大哥,真心沒用過!!uj5u.com熱心網友回復:
pb11+webservice開發分布式三層應用
一、 WEBSERVICE服務端的開發
1、 新建立一個workspace作業區
先擇FILE選單下的NEW,新建一個作業區。
點擊后出現下圖
在檔案名處輸入作業區的名稱,假設我們的作業區名為webserver,單擊保存按鈕。這樣作業區就建立成功了。
2、 建立一個.net web service 應用
點擊FILE選單下的NEW
選中 .net web service 點擊 ok按鈕
點擊 next按鈕
點擊 next按鈕
這里我們不修改pbl庫名,當然你可以按你的意思修改庫名,點擊 next 按鈕。
一直點 next按鈕直到出現
這里需要注意一點,如果你當前的IIS埠,不是默認的80 ,那么在localhost后面要加上
“:81” ,假設你的埠號是81的話。
再點擊一次next直到finish按鈕。
3、 連接資料庫
我們先來建立一個資料庫的連接以為后期的webservice服務提供一個連接。
打開系統生成的 n_webservice對像
在里面寫上
// Profile EAS Demo DB V110
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=EAS Demo DB V110;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 回傳引數 //
////////////////////////////////////////////////////////////////////////////
long ll_row,ll_returnrow
string ls_returnmodiy
string ls_oldsql,ls_newsql,ls_error
string csa
int i,LI_WHERE
connect;
if SQLCA.SQLCode <> 0 then
as_returnerr="連接資料庫出錯,請檢查資料庫連接引數。"+string(sqlca.sqlerrtext)
return -1////創建資料視窗出錯
end if
if ds1.create(as_syntax,ls_error)<>1 then
disconnect using sqlca;
as_returnerr="服務端重建資料視窗出錯! "+ls_error
return -1////創建資料視窗出錯
end if
int li_a
li_a=ds1.settransobject(sqlca)
if li_a<>1 then
disconnect using sqlca;
as_returnerr="服務端設定資料存盤事務出錯!"
return -1///設定對像事物出錯
end if
ls_oldsql=ds1.getsqlselect()
if trim(ls_oldsql)='' or isnull(trim(ls_oldsql)) then
disconnect using sqlca;
as_returnerr="傳入的資料視窗對像sql語法為空!"
return -1 //取新視窗語法出錯
end if
LI_WHERE = pos(UPPER(ls_oldsql),'WHERE',1)
IF LI_WHERE = 0 THEN
ls_oldsql=ls_oldsql + " WHERE 1=1 "
END IF
ls_newsql=ls_oldsql +' '+as_sql
if trim(ls_newsql)='' or isnull(trim(ls_newsql)) then
disconnect using sqlca;
as_returnerr="連結后的sql語法為空!請檢查傳入的資料視窗對像sql語法。"
return -1 //取新視窗語法出錯
end if
if Match ( ls_newsql, '"' ) then
disconnect using sqlca;
as_returnerr="重組后的sql語法出錯,資料視窗語法不能包含雙引號!"+ls_newsql
return -1//設定新視窗語法出錯
elseif not Match ( upper(ls_newsql), "WHERE" ) then
disconnect using sqlca;
as_returnerr="重組后的sql語法出錯,資料視窗必須包含一個where條件"+ls_newsql
return -1//設定新視窗語法出錯
end if
if ds1.modify( 'DataWindow.Table.Select="' + ls_newsql+'"' )<>"" then
disconnect using sqlca;
as_returnerr="重組后的sql語法出錯,請檢查資料視窗對像SQL語法。"+ls_newsql
return -1//設定新視窗語法出錯
end if
ll_row=ds1.retrieve()
if ll_row<0 or isnull(ll_row) then
disconnect using sqlca;
as_returnerr="資料檢索出錯!"+ls_err_a+ls_newsql
return -1//服務端檢索資料出錯
end if
if ds1.modify('DataWindow.Table.Select="' + ls_oldsql+'"' ) <>"" then
disconnect using sqlca;
as_returnerr="還原舊資料視窗語法出錯,請檢查資料視窗對像語法是否含有雙引號。"+ls_oldsql
return -1 //還原舊資料視窗語法出錯
end if
ll_returnrow=ds1.getfullstate(dwo_blob)
if ll_returnrow<0 or isnull(ll_returnrow) then
disconnect using sqlca;
as_returnerr="服務端進行blob時,獲取資料行出錯!"
return -1 //封裝到blob變數時出錯
end if
disconnect using sqlca;
destroy ds1;
as_returnerr="資料檢索成功!"
// destroy n_webservice
return ll_returnrow
3、 把服務端發布到IIS服務
打開我們的P_webservice_webservice編譯object 。點擊編譯,pb11會自動將webservice發布到我們原來定義的IIS服務器上
發布的時候要注意一點就是在objects選項卡上,必須先中我們上面的函式(或者叫方法),library list選項卡上要選上我們的pbl庫檔案。點擊第一輛小車 deploy project其它就交給pb自已去完成了。
4、 編譯完成后run一下我們的webservice看看是否發布成功,
出現上圖并能看到我們定義的函式(我總是喜歡叫它們方法),webservice就算是發布成功了。
這樣我們就完成了一個服務端檢索方法。下一節我們接著繼續講解如何用客戶端檢索資料。
二、 客戶端呼叫webservice
1、 建立一個PB應用
點擊確定后
點擊 finish 完成
2、 給工程附加 pbsoapclient110.pbd
這個檔案通常在pb11的安裝目錄里,可以通過搜索找到它,然后將這個檔案拷貝到我們新建應用的目錄下,并附加到工程里面來。
3、 為應用添加一個webservice proxy
函式添加完成后在工程里面添加一個視窗,我們來實驗一下我們前面的作業
注意:應用程式要與webservice通訊都要通過webservice proxy來完成,所以我們首先要建立一個 proxy
Ok后
這里的wsdl file name
如果你記不住就打開webservice 端,工程檔案的 object項上面去找
然后一直下一步到下圖
寫上一個proxyname 我寫的是 myproxy
一直到下一步完成。
打開我們剛才定義的代理,并編譯,順利的話會看到庫檔案中添加了很多結構,這些我們都不用管,接著做我們后面的作業就好。
4、 新建一個custom class
5、 給新建立的對像添加一個函式
這個函式就是代替二層開發模式下的retrieve函式的,這里你可以將這個函式多次多載以方便前臺開發人員呼叫,目前這個函式支持 給視窗添加where條件,檢索并回傳錯誤或成功的資訊。以及回傳檢索到的行數。還是不太明白的可以加我的QQ:47570471,我的文筆從上幼兒園開始就不是強項,估計說得也不是太明白,不過歡迎大家QQ騷擾。總之就是多載到前端開發人員分不出是在開發二層還是三層就算ok了,見下圖:
為對像添加二個實體變數
SoapConnection i_conn
myproxyn_webservicesoap pb_soap //// myproxyn_webservicesoap這個名稱如果你前面建立代理的時候用的是myproxy那應該就是這個,如果不是就去找你生成的代理對像名稱。
Constructor 事件里面寫上
i_conn=create SoapConnection
//i_conn.setsoaplogfile( "mis.log")
i_conn.createinstance( pb_soap,"myproxyn_webservicesoap")
destructor事件里面寫上
destroy pb_soap;
destroy i_conn;
對像到這里建立完成。
1、 給應用添加一個全域變數
soapserver mis
注意:soapserver為上面定義的對像的名稱。
在視窗的open事件里面上
mis =create soapserver
2、 做一個資料視窗(這個不用說了吧)
3、 把資料視窗拖到我們的測驗表單
4、 拖一個commandbutton
里面寫上: mis.retrieve(dw_1)//////
如果資料檢索到資料視窗了,那么我們本次的實驗就算成功了。
下一節我們接著講單資料視窗及多資料視窗的 update
以及存盤程序的呼叫及oracle序列的通用方法………
Guoac qq:47570471
三、 三層結構的更新
1、 webservice端方法
新建立一個函式
int li_change=0
string ls_error=""
connect;
if SQLCA.SQLCode <> 0 then
as_err_return="連接資料庫出錯,請檢查資料庫連接引數。"
return -1////創建資料視窗出錯
end if
if ds1.create(as_syntax,ls_error)<>1 then
disconnect using sqlca;
as_err_return="服務端重建資料視窗出錯,請檢查您傳入的資料視窗對像!"+ls_error
return -1
end if
if ds1.settransobject(sqlca)<>1 then
disconnect using sqlca;
as_err_return="服務端設定資料存盤事務出錯!"+ls_err_a
return -1
end if
li_change=ds1.SetChanges(dwo_object)
if li_change = 1 then
if ds1.Update()= 1 then
commit using sqlca;
disconnect using sqlca;
as_err_return="資料更新成功!"
return 1
else
as_err_return=ls_err_a
rollback using sqlca;
disconnect using sqlca;
return -1
end if
else
disconnect using sqlca;
as_err_return= "取更新行封裝到blob時出錯!"
return -1
end if
2、 前端更新方法
建立的方法見前面,RETRIEVE的方法,這里我們建立一個update函式
int li_return,li_dwreturn
long ll_rv
string ls_syntax
blob lblb_data
as_dwoname.accepttext( )
li_dwreturn=as_dwoname.GetChanges(lblb_data)
if li_dwreturn=0 then
as_err_return='客戶端資料視窗沒有需要更新的資料。'
return 1
end if
if li_dwreturn =-1 then
as_err_return="客戶端取資料視窗變更封裝到blob時出錯。"
return -1
end if
ls_syntax=as_dwoname.describe('datawindow.syntax')
if ls_syntax='' or ls_syntax="" then
as_err_return="客戶端資料視窗語法為空。"
return -1
end if
if MIS.uf_update(lblb_data,ls_syntax,as_err_return)=1 then
as_dwoname.ResetUpdate()
return 1
else
return -1
end if
近期因為專案的原因,可能沒什么時候來整理這個檔案了,只能先寫到這里,如果有什么問題可以給我留言。另外關于多數窗的更新問題,我希望大家也能自已動手去試一下,方法就是傳入一個資料視窗陣列到WEBSERVICE,WEBSERVICE端進行多表多更的事務控制。
PB11+WEBSERVICE+WINFROM應用方式是我們目前一個大型系統的開發模式。這樣模式只需要發布WINFROM到IIS后,客戶端就不需要安裝任何技撐的東西,對于以后版本的的更新也由PB全自動管理。讓PB的開發模式發生了很大的改變。另正式應用程序中還會涉及到應用服務器集群及資料庫連接池的問題,不然每一次檢索或更新都要連接資料庫,可能誰都認為這不是個好的解決方案。更多需要優化及相關的領域的有待大家去研究。也希望有更多的人回到PB的開發陣營,呵,最起碼招人的選擇更多一些!開個玩笑。
另外在專案中可能還會有比如二層模式下通用查詢,子資料視窗檢索,存盤程序通用方法等一些問題。希望有更多的人來研究這些東西。呵,孤軍混戰確實不是好的主意。
uj5u.com熱心網友回復:
也可參考http://download.csdn.net/detail/teachman_999/326075
uj5u.com熱心網友回復:
大版,LZ用的WS服務器端可能不是PB做的.uj5u.com熱心網友回復:
Web Service是.net寫的?pb做界面,net做后臺!uj5u.com熱心網友回復:
不錯!學習了。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/52533.html
標籤:Web 應用
上一篇:pb中ole不能顯示的原因
