天天看点

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转三层

继续阅读