三層式的架構倒底好不好,我想目前還是見仁見智的問題
但我們可以了解到邏輯上的多層式寫法,是目前的主流,
這裏提供我實作三層式架構之範例給大家參考....
(linux,mysql,winxp,MTS & vfp)
我的環境
Database:
redhat 9.0
mysql server 昇級到 4.1.7(不確定是否必要)
昇級網址:http://www.mysql.com
MTS SERVER:
WINDOWS XP HAVE SP2
在這裏要安裝
1.VISUAL FOXPRO 8.0(我沒提供)
2.MYOLEDB 下載網址
要裝3.0的,因為我之前使用2.5版的會出現"災難性失敗"
開發端:
WINDOWS XP WITH SP2
VISUAL FOXPRO 8.0
MYOLEDB
CLIENT 端:
WINDOWS 98 UP
VISUAL FOXPRO 8.0 LIBERARY
作法:
1. 在linux上建立一個mysql的database 假設名為 testdata
2. 在testdata中建立一個table名為customer欄位為 cu_no vchar(5),cu_na vchar(8)
3. 在開發端使用VISUAL FOXPRO 8.0建立COM元件
3.1建立一個VFP的專案
3.2增加一個prg程式,名字隨您高興,假設為dncon
dbcon.prg程式碼如下:
*設定公用函式
Set Procedure To mylib
*建立客戶類別
Define Class CUSTOMER As Custom OlePublic
*放在此處的變數要引用時,需加 this.
p_server="your_linux_server_ip_or_serve_name"
p_database="testdata"
p_user="mysql_user_name"
p_password="user_password"
*連線
Function CON
ocn=adocon(this.p_server,this.p_database,this.p_user,this.p_password)
* ocn=adocon(p_server,p_database,p_user,p_password)
oRs=ocn.execute("Select * from custom")
Return oRs
Endfunc
Enddefine
*
3.3另外建mylib.prg將共用的程式碼放在此
程式碼如下:
*adocon : mysql ado connect 傳回 ado 物件 Function adocon Lparameters p_server,p_database,p_user,p_password oMTX = Createobject("MTXAS.APPSERVER.1") oContext = oMTX.GetObjectContext() * constr="Provider=MySQLProv;" constr=constr+"Location="+p_server+";" constr=constr+"Data Source="+p_database+";" constr=constr+"USER ID="+p_user+";" constr=constr+"PASSWORD="+p_password+";" constr=constr+"option=3;port=3306;" Cn = Createobject("ADODB.Connection") * Cn.Open(constr) If Type("cn")="O" oContext.setcomplete() Else oContext.setabout() Endif Return Cn Endfunc |
******* *odbccon: mysql odbc connect 傳回 connect handle *註:這是我之前測試myodbc的連接,也成功,但因使用mts無法傳回cursor *所以暫時放著,這裏先不談這個的用法,僅放連接程式給大家參考 Function odbccon Lparameters p_server,p_database,p_user,p_password oMTX = Createobject("MTXAS.APPSERVER.1") oContext = oMTX.GetObjectContext() * constr="DRIVER={MySQL ODBC 3.51 Driver};" constr=constr+"SERVER="+p_server+";" constr=constr+"DATABASE="+p_database+";" constr=constr+"UID="+p_user+";" constr=constr+"PASSWORD="+p_password+";" * Cn=Sqlstringconnect(constr) If Cn>0 oContext.setcomplete() Else oContext.setabout() Endif Return Cn ENDFUNC |
3.4程式寫好之後,接下就是將它編譯成dll檔
在編譯時選擇編譯成Muti-thread COM server(dll)
這樣就得到兩個檔案 dbcon.dll跟dbcon.tlb
4. 安裝com 元件
4.1將dbcon.dll及dbcon.tlb複製到MTS server上
4.1開啟MTS server的控制台->系統管理工具->元件服務
展開 元件服務->電腦->我的電腦->com+應用程式
然后在 com+應用程式上按mouse右鍵,選擇功能表上的 新增->應用程式
然后會出來一個安裝精靈選下一步->建立空的應用程式
輸入您要取的應用程式名稱,假設為erp
至於啟動類型的的選項我還沒研究,我是用預設值
建立好之後,您會在com+應用程式中增加了一個名為erp的應用程式
展開到erp->元件 在”元件”上按mouse右鍵
功能表選新增->元件
然后會蹦出來一個元件安裝精靈,按下一步
選擇安裝新元件,然後選取您剛剛存放在MTS server上的dbcon.dll跟dbcon.tbl
注意!!這兩個檔案一定要同時選取,否則會出現錯誤!!
最後按下一步->完成
這時候您已將MTS server的元件準備好了
那您會問,client端怎麼執行?沒錯,這也是我之前的疑問
幸好elleryq兄幫我解惑,在此感謝,讓我得以繼續
接下來就是安裝到client端的作法
5. 展開元件服務到 電腦->我的電腦->com+應用程式->erp <=剛剛裝的
5.1在erp上按mouse右鍵,功能表選 匯出
5.2出現應用程式匯出精靈,按下一步 輸入您要輸出的安裝檔名稱要包含路徑
假設為c:dbclient
或者按右側的 瀏覽 按钮存放您要輸出的檔案,輸出選項要選擇“應用程式proxy-安裝在其他…..”,出來一個確認訊息,按“是”,這時候系統會產生兩個檔案,c:dbclient.MSI 及 c:dbclient.cab
然后將這兩個檔案copy到client端的電腦,執行dbclient.MSI安裝,完成后
client就可以使用dbcon.CUSTOMER的元件了
註:之前我用webmin在customer中新增兩筆資料,如下:
cu_no cu_na
==== ========
a001 a0000001
b001 b0000001
接下來,為了要測試,所以我在client端也裝了Visual Foxpro 8.0
開啟一個新專案->新增一個prg程式,假設為testserver.prg
程式碼如下:
mycon=CreateObject(‘dbcon.customer’) oRs=mycon.con() if type(“rs”)=”O” do while !rs.eof ?rs.fields(“cu_no”).value+” “+rs.fields(“cu_na”).value rs.movenext enddo endif |
結果:
a001 a0000001
b001 b0000001
這時候您到MTS server上看,會發現您安裝的erp上的 dbcon.CUSTOMER元件
的圖示會轉啊轉,表示正在運行中
以上就是目前為止我的測試心得
當然,我強調一點,我是MTS跟OO的初學者,以上一定會有不理想的地方
若是您願意的話,歡迎批評指教,謝謝!!
註1:測試完之後或許您會有疑問,是否需要每次元件更改都要做一次匯出,然後安裝到client端的動作?,其實您要是沒有在MTS上新增其他元件,或增加類別的話,是不需要的
註2:傳回來的是ado.recordset的元件,因為vfp的cursor不可傳
發表於 2006/03/30 08:21 AM
沒有留言:
張貼留言