很多朋友肯定遇到過這樣的需求,以前開發的老程式,采用CS架構,用戶端直接連接配接資料庫,這樣的程式在很長一段時間内占據了主流。程式在客戶的區域網路裡面一直運作良好。突然有一天,客戶說我要開分店了,我的分店能不能使用這個軟體和總店連接配接?我經常在外面,你的軟體在外網上能不能操作和進行報表檢視?好吧,客戶是上帝(神馬人民币?)于是乎,開始忙碌。。。
最先想到工作量最少,那麼把資料庫遷移到外網,程式直接通路外網資料庫。看起來不錯,但是資料庫暴露在網際網路上,心裡總感覺有點不踏實,
好吧,不管了,先滿足需要吧,客戶又不知道,還有誰沒事去攻擊這個呢。。。。說服自己後開始幹了,很快完成了。配置一下就行,确實友善
幾乎不用改什麼,可是一測試,泥馬,速度怎麼比區域網路慢這麼多,自己都接受不了,怎麼給客戶?
沒辦法開始改方案,自己建個伺服器,把業務邏輯分離出來移到伺服器上,伺服器和用戶端使用指定協定進行互動。伺服器開發用什麼語言?伺服器
穩定嗎?怎麼和用戶端互動?大資料量能不能抗得住?很多客戶連接配接會不會有問題?。。。一堆問題,費了不少腦細胞終于想通了,可是程式好幾十個子產品,
怎麼分離,要多久,修改之後穩定嗎,hold不住了。
好吧,我承認,前面的場景都是為了引出我們的主角SATRDA, 這樣的場景确實是我經曆過後才有了SATRDA這個元件。我就不多介紹了,
下載下傳位址:
http://download.csdn.net/detail/pcwe2002/9690008
最新版本下載下傳,交流請到QQ群:345559891
包括PB,delphi,VB示例。大家可以下載下傳後看說明:)
附一個和兩層的速度對比,
伺服器端配置:阿裡雲 單核1G,1M帶寬
用戶端:XP 酷睿I5 2G, 20M帶寬
下面進行主題。
為了示範,我從網上搜了一個兩層的VB超市管理系統,背景資料庫是sqlserver
下載下傳位址:
http://www.codesky.net/showhtml/7122.htm
解壓後,發現運氣不錯,還有說明,按照說明用他的工具把資料庫建立起來了(挺友善,贊一下)。
找開背景管理檔案夾,按說明注冊了控件。
打開SuperMarket.vbp,點運作出現了登入界面
看來能運作,不過資料連接配接沒改,肯定連不上資料庫,退出來,看看代碼。登入視窗很好找,一看名稱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為任意合法端口号。再運作,那麼你可以看到這個界面
3. 把示例中的satrda.dll,libcurl.dll,zlib1.dll三個dll,拷到工程目錄下面, 增加一個函數
Function boolean SATODBC_Install(boolean quiet) library "satrda.dll"
該函數的作用是注冊驅動,可以在程式開頭調用,進行驅動的自動注冊(多次調用不會重複注冊)。
如果驅動正常注冊後打開odbc資料源管理器,可以找到下圖的驅動
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
不然運作後出會現如下錯誤:
主要是recordset如果使用PageSize等屬性時,需要指定為用戶端遊标。 在建立rs時,加上屬性rs.CursorLocation = adUseClient也行。
登入後,正常進入主界面。點進貨管理,又出現
看代碼是因為用到了報表,指定的報表資料源與現有的不同,打開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個小時。
伺服器放到阿裡雲上試試,速度杠杠的。