大家好個,我想問:我們團隊用pb開發了一個專案,現在涉及到升級問題,流程是這樣的,開電腦->運行我程式檢測服務器是否有更新-> 1、如果有彈出升級提示->下載檔案,修改配置->重啟電腦
-> 2、如果沒->啟動系統
現在關鍵是我不知道怎么去服務器上檢測是否有更新?請高人賜教!多謝!
uj5u.com熱心網友回復:
加個表存放最新版本資訊,運行程式時先取得資訊,跟程式版本比較!uj5u.com熱心網友回復:
曾經做過把新的pbd檔案存到資料庫里,程式運行開始時比較時間來更新uj5u.com熱心網友回復:
收藏內容用PB實作客戶端程式的自動升級
C/S結構的運行模式雖然沒有B/S結構更加容易擴展和簡便,但由于其穩定性好、安全性高、運行速度快等特點,現在仍然被廣泛應用于各種大型應用系統中,有些則和B/S形成混合的運行模式。
B/S優越于C/S的一個很大特點就是,客戶端不需要安裝客戶端軟體,通過瀏覽器就可以實作各種應用,并且服務器上的內容的變化可以快速反映到客戶端。如果讓客戶端軟體也實作自動升級,可以彌補C/S模式在這方面的缺陷。本文就給出了一種可自動升級客戶端軟體的設計思路,并給出了使用PB的實作方法。
1 實作思路
整個軟體結構包括:升級資料庫服務器、升級代理程式、客戶端應用程式、升級服務管理程式等。升級資料庫器保存各個版本軟體的版本、檔案名、檔案內容等資訊;升級代理程式負責讀取升級資料庫服務器中的最新版本資訊和檔案資訊,完成最新版本下載和更新,并啟動客戶端應用程式;客戶端應用程式為客戶端具體應用的程式軟體,即為需要實作更新的軟體;最新版本上載程式是升級資訊管理程式,用于上傳最新的版本資訊和相應的檔案內容。
客戶端應用程式運行之前,先啟動一個升級代理程式, 該代理從升級資料庫服務器中讀取升級資訊,如果存在最新版本,提示用戶并決定是否下載最新版本,然后并啟動客戶端應用程式。
升級資訊使用如下資料表(soft_fileinfo)進行維護和管理,檔案版本號保存檔案的版本資訊,檔案名和檔案內容保存檔案的名稱和檔案的二進制內容。創建改變的SQL陳述句如下(ASA7資料庫):
CREATE TABLE dba.soft_fileinfo(
version char(14) NOT NULL, //檔案版本號
filename char(30) NOT NULL, //檔案名
filedata long binary, //檔案內容
PRIMARY KEY (version, filename)); //以檔案版本號和檔案名為主鍵
下面給出PB中的程式實作方法,假設客戶端應用程式執行檔案名為"sale.exe",升級資料庫服務器采用ASA7。
2 客戶端升級代理程式實作
在PB中創建一個應用,在應用的實體變數中宣告:
string old_version
declare get_new_filename cursor for
select filename
from dba.soft_fileinfo
where version > :old_version;
在Open事件中撰寫如下代碼:
string ls_newversion
//連接升級服務器,這里我們用ASA7資料庫代替升級資料庫服務器
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=EAS Demo DB V4;UID=dba;PWD=sql', ConnectOption='SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT'"
connect using sqlca;
if sqlca.sqlcode = 0 then
//讀取本地版本號
RegistryGet("HKEY_LOCAL_MACHINE\Software\MySoftware\sale", "Version", RegString!, old_version)
//讀取升級服務器上的最新版本號
select max(version) into :ls_newversion
from dba.soft_fileinfo;
//如果升級服務器上的最新版本號大于本地版本號,提示下載最新程式
if old_version < ls_newversion then
if MessageBox("注意","存在最新版本程式,是否立即升級?",Question!,YesNo!) = 1 then
//下載最新程式
string ls_filename
blob lb_filedata
blob lb_tempdata
long max_len = 32765
long ll_len
//通過游標,得到所有需要更新的檔案名,然后分別處理
open get_new_filename;
fetch get_new_filename into :ls_filename;
do while (sqlca.sqlcode = 0)
//得到最新版本的相應檔案內容
selectblob filedata into :lb_filedata
from dba.soft_fileinfo
where filename = :ls_filename
order by version desc;
long ll_file,loops,i
//洗掉舊版本檔案
FileDelete(ls_filename)
//創建新的檔案
ll_file = FileOpen(ls_filename,StreamMode!,Write!,LockReadWrite!, Append!)
ll_len = len(lb_filedata)
//由于PB中的FileWrtie一次只能寫入32765大小的檔案,所以必須分多次讀寫
IF ll_len > max_len THEN
IF Mod(ll_len, max_len) = 0 THEN
loops = ll_len/max_len
ELSE
loops = (ll_len/max_len) + 1
END IF
ELSE
loops = 1
END IF
FOR i = 1 to loops
lb_tempdata = BlobMid(lb_filedata,(i - 1)*max_len + 1,max_len)
FileWrite(ll_file,lb_tempdata)
NEXT
FileClose(ll_file)
//讀取下一個檔案內容
fetch get_new_filename into :ls_filename;
loop
close get_new_filename;
end if
end if
else
MessageBox("錯誤","沒有成功連接升級服務器")
end if
//運行應用程式
Run("sale.exe")
3 升級服務管理程式實作
升級服務管理程式的實作實際就是一個維護soft_fileinfo表的應用程式,可以修改版本資訊,也可以添加新的版本資訊和檔案內容。這一部分思路比較簡單,這里不再給出所有具體的程式代碼,僅給出PB將新版本檔案寫入資料庫的方法。
integer li_FileNum, loops, i
long flen, bytes_read, new_pos
blob b, tot_b
//得到當前選擇的檔案的內容大小,sle_filename包含檔案所在路徑及檔案名
flen = FileLength(sle_filename.Text)
//打開檔案
li_FileNum = FileOpen(sle_filename.Text,StreamMode!, Read!, LockRead!)
//由于FileRead函式一次只能讀出32765大小的資料,所以先計算讀取次數
IF flen > 32765 THEN
IF Mod(flen, 32765) = 0 THEN
loops = flen/32765
ELSE
loops = (flen/32765) + 1
END IF
ELSE
loops = 1
END IF
new_pos = 1
//分多次讀出檔案中的所有資料,放在tot_b變數中
FOR i = 1 to loops
bytes_read = FileRead(li_FileNum, b)
tot_b = tot_b + b
NEXT
//關閉檔案
FileClose(li_FileNum)
修改當前版本的檔案內容
updateblob dba.soft_fileinfo
set filedata = :tot_b
where version = current_version;
//如果保存成功,遞交資料庫
IF sqlca.SQLNRows > 0 THEN
COMMIT;
else
rollback;
messagebox("錯誤","檔案內容保存失敗!")
END IF
uj5u.com熱心網友回復:
實作思路:1、涉及的相關技術
pb ftp功能實作
pb webservice功能實作
2、流程
(1)在服務器端建立一個表,主要用來儲存程式版本號和需要更新的檔案串列
(2)通過webservice取到表的內容,與本地存盤的程式版本號進行對比是否需要更新
(3)如需要更新,根據取到的更新檔案串列通過ftp下載,并進行更新。
uj5u.com熱心網友回復:
謝謝各位高手的指教,此問題還在研究中!uj5u.com熱心網友回復:
現在是取不到版本號,取出來后對它們的比較很模糊。對了忘了說我用的是pb10.5版本的!有好的建議繼續,關注中!轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/81544.html
標籤:腳本語言
上一篇:關于pb和access的連接
