天天看點

VB程式兩層C/S轉三層

很多朋友肯定遇到過這樣的需求,以前開發的老程式,采用CS架構,用戶端直接連接配接資料庫,這樣的程式在很長一段時間内占據了主流。程式在客戶的區域網路裡面一直運作良好。突然有一天,客戶說我要開分店了,我的分店能不能使用這個軟體和總店連接配接?我經常在外面,你的軟體在外網上能不能操作和進行報表檢視?好吧,客戶是上帝(神馬人民币?)于是乎,開始忙碌。。。

最先想到工作量最少,那麼把資料庫遷移到外網,程式直接通路外網資料庫。看起來不錯,但是資料庫暴露在網際網路上,心裡總感覺有點不踏實,

好吧,不管了,先滿足需要吧,客戶又不知道,還有誰沒事去攻擊這個呢。。。。說服自己後開始幹了,很快完成了。配置一下就行,确實友善

幾乎不用改什麼,可是一測試,泥馬,速度怎麼比區域網路慢這麼多,自己都接受不了,怎麼給客戶?

沒辦法開始改方案,自己建個伺服器,把業務邏輯分離出來移到伺服器上,伺服器和用戶端使用指定協定進行互動。伺服器開發用什麼語言?伺服器

穩定嗎?怎麼和用戶端互動?大資料量能不能抗得住?很多客戶連接配接會不會有問題?。。。一堆問題,費了不少腦細胞終于想通了,可是程式好幾十個子產品,

怎麼分離,要多久,修改之後穩定嗎,hold不住了。

好吧,我承認,前面的場景都是為了引出我們的主角SATRDA, 這樣的場景确實是我經曆過後才有了SATRDA這個元件。我就不多介紹了,

下載下傳位址:

http://download.csdn.net/detail/pcwe2002/9690008

最新版本下載下傳,交流請到QQ群:345559891 

包括PB,delphi,VB示例。大家可以下載下傳後看說明:)

附一個和兩層的速度對比,

伺服器端配置:阿裡雲 單核1G,1M帶寬

用戶端:XP 酷睿I5 2G, 20M帶寬

VB程式兩層C/S轉三層

下面進行主題。

為了示範,我從網上搜了一個兩層的VB超市管理系統,背景資料庫是sqlserver

下載下傳位址:

http://www.codesky.net/showhtml/7122.htm

解壓後,發現運氣不錯,還有說明,按照說明用他的工具把資料庫建立起來了(挺友善,贊一下)。

找開背景管理檔案夾,按說明注冊了控件。

打開SuperMarket.vbp,點運作出現了登入界面

VB程式兩層C/S轉三層

看來能運作,不過資料連接配接沒改,肯定連不上資料庫,退出來,看看代碼。登入視窗很好找,一看名稱frmLogin肯定是你了,

找到确定按鈕的代碼,發現了連接配接函數sqlConnect, 把連接配接串改成我的資料庫,再進入,輸入密碼admin, 進去了,看界面還不錯,點幾個界面操作了下,也正常。

程式沒問題,好,那我們進入主題,看看如何改成三層的。(我們先假設你已經看過了SATRDA的說明)

1.打開SATRDA的Server檔案夾,用文本編輯器打開dbconfig檔案,我使用的notepad++,比notepad格式看起來好些,看起來像這樣

{
	"mssql": {
		"DBType": "odbc",
		"Provider": "driver=sql server native client 10.0;server=X6P2J80LPMLFALP\\SQLEXPRESS;uid=dbuser;pwd=sql;database=test"
	},
	"orcl": {
		"DBType": "odbc",
		"Provider": "driver=Oracle in OraDb10g_home1;SERVER=ORCL;uid=system;pwd=sql;EXC=T"
	},
	"mytest": {
		"DBType": "sqlite",
		"Provider": "dbname=ccc"
	}
}
           

因為用的sqlserver資料庫,我複制一個mssql,修改後像這樣

{
	"mssql": {
		"DBType": "odbc",
		"Provider": "driver=sql server native client 10.0;server=X6P2J80LPMLFALP\\SQLEXPRESS;uid=dbuser;pwd=sql;database=test"
	},
	"marketdb": {
		"DBType": "odbc",
		"Provider": "driver=sql server native client 10.0;server=X6P2J80LPMLFALP\\SQLEXPRESS;uid=dbuser;pwd=sql;database=SuperMarketdb;"
	},
	"orcl": {
		"DBType": "odbc",
		"Provider": "driver=Oracle in OraDb10g_home1;SERVER=ORCL;uid=system;pwd=sql;EXC=T"
	},
	"mytest": {
		"DBType": "sqlite",
		"Provider": "dbname=ccc"
	}
}
           

2. 運作satserver.exe, 如果成功,那麼恭喜你。有可能看到界面閃了一下,就不見,那麼就是端口号被占用了,打開config檔案

{
	"TAG": "QQ:9091178",
	"Port": 80,
	"Log": 0,
	"SecrectKey":""
}
           

修改"Port": 80中80為任意合法端口号。再運作,那麼你可以看到這個界面

VB程式兩層C/S轉三層

3. 把示例中的satrda.dll,libcurl.dll,zlib1.dll三個dll,拷到工程目錄下面, 增加一個函數

Function boolean SATODBC_Install(boolean quiet) library "satrda.dll"

該函數的作用是注冊驅動,可以在程式開頭調用,進行驅動的自動注冊(多次調用不會重複注冊)。

如果驅動正常注冊後打開odbc資料源管理器,可以找到下圖的驅動

VB程式兩層C/S轉三層

4. 回到VB工程修改sqlconnect函數為

'連接配接SQL伺服器
Public Function sqlConnect(ByVal cnThis As ADODB.Connection, ByVal strServer As String, ByVal strUser As String, ByVal strPass As String, Optional ByVal strDataBase As String = "")
    Dim strSQL As String
    Dim server As String, db As String
    
    server = "127.0.0.1:5555"
    db = "marketdb"
    '生成連接配接字元串
    'strSQL = "provider=sqloledb;server=" & strServer & ";user id=" & strUser & ";password=" & strPass
    strSQL = "Provider=MSDASQL.1;Password=sql;User ID=dbuser;Extended Properties=""driver=Smart ODBC Driver;server=" & server & ";DB_NAME=" & db & ";"""


    cnThis.CursorLocation = adUseClient     '注意,必須使用adUseClient
    cnThis.Open strSQL
End Function
           

這裡一定要有,

CursorLocation = adUseClient 
           

不然運作後出會現如下錯誤:

VB程式兩層C/S轉三層

主要是recordset如果使用PageSize等屬性時,需要指定為用戶端遊标。 在建立rs時,加上屬性rs.CursorLocation = adUseClient也行。

登入後,正常進入主界面。點進貨管理,又出現

VB程式兩層C/S轉三層

看代碼是因為用到了報表,指定的報表資料源與現有的不同,打開DataEnv1,修改Connection1屬性ConnectionSource為

Provider=MSDASQL.1;Password=sql;User ID=dbuser;Extended Properties="driver=Smart ODBC Driver;server=127.0.0.1:5555;DB_NAME=marketdb;"

修改後運作正常了。

試着點其它功能,都沒有問題了。到這裡,原來的兩層,成功轉成三層,用時,不到1個小時。

伺服器放到阿裡雲上試試,速度杠杠的。

VB程式兩層C/S轉三層

繼續閱讀