设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 6368|回复: 11
打印 上一主题 下一主题

[模块/函数] Access菜鸟七大邪门武器之三—以winsock方式快速搭建服务器版access

[复制链接]
跳转到指定楼层
1#
发表于 2013-11-7 20:53:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ganlinlao 于 2013-11-7 21:24 编辑

Access菜鸟七大邪门武器之三—以winsock方式快速搭建服务器版access

        这不算很好的方案,但也不算很烂的方案。如果你的数据不算多,用户使用称不上繁杂,
不需要可怕的高并发,不需要可怕的灾难恢复。特别是如果你对Access一见钟情,大有以身相许的豪迈,
那么本邪门武器,可能真的很适合你。

      既然是以winsock的方式,那么在这里我将推荐一个NetData。这是对winsock的再封装,可以说专用于
access。适合小型的C/S方式。是快速让你的access成为服务器版的一枝伤心小箭。
     但在使用之前,你一定要适当了解一下winsock的优缺点。别进洞房,才发现媳妇不是高小姐,而是大师兄
那比守寡还添堵啊。

服务端:
    1、单端口多连接。这是常用的
    2、双端口多连接。如果你的数据传输量比较大,可以在服务端使用双端口。一个负责接收数据,写入数据库,一个负责查询,发送数据。
    这样子性能会有所改观。
    3、多用户多端口多连接。跟聊天差不多。

服务端使用很简单:你可以用任何支持com的语言写,包括vbscript和jscript。也可以用access来写,不过access得一直开着。
在这里图方便我使用vb6。在vb6中建立一个form1。引用netdata控件。
代码如下:
Private Sub Form_Load()
Dim objXMLDoc As Object, strConn As String, strPort As String
'获取config配置文件,用配置文件是为了方便更改数据库连接和端口
Set objXMLDoc = CreateObject("msxml2.DOMDocument.6.0")
If objXMLDoc Is Nothing Then Set objXMLDoc = CreateObject("msxml2..DOMDocument.3.0")
On Error GoTo errhandler
objXMLDoc.Load App.Path & "\" & "config.xml"
strConn = objXMLDoc.getElementsByTagName("ConnectionString")(0).Text
strPort = objXMLDoc.getElementsByTagName("Port")(0).Text

    '指定服务器上数据库的连接字符串,和服务器对外提供的监听端口
    '并打开服务器的服务...
    NetDataServer1.Start strConn, strPort
    Set objXMLDoc = Nothing
Exit Sub
errhandler:
MsgBox "没有找到config文件!"
End
End Sub

Private Sub Form_Unload(Cancel As Integer)
    NetDataServer1.Down  '关闭服务,释放资源...
End Sub

其实你只要两行代码就可以了。
form_load事件写入 netdataserver1.start "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=cs.mdb;","8899"
form_unload事件写入 netdatasever1.down
编译运行。一个服务器版的access建立起来了。

配置文件config.xml如下:
<?xml version="1.0" encoding="GBK"?>
<config>
<!--数据库连接字符串,如果是07版本以上,请用Microsoft.ACE.OLEDB.12.0;-->
<ConnectionString>Provider=Microsoft.Jet.OLEDB.4.0;Data Source=cs.mdb;</ConnectionString>
<!--设置端口,最好在10000以上,不超过65536,以避免跟其它默认端口冲突-->
<Port>8899</Port>
</config>

评分

参与人数 2经验 +40 收起 理由
todaynew + 10 很给力!
admin + 30 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享分享 分享淘帖1 订阅订阅
2#
 楼主| 发表于 2013-11-7 20:53:44 | 只看该作者
本帖最后由 ganlinlao 于 2013-11-7 21:44 编辑

客户端代码:
access中先引用netdata控件。
因为数据传输很频繁。所以把 netdataclient连接写在模块1中,以重复使用。
代码如下:
Option Compare Database
Option Explicit
Public NetDataClient1 As Object
Public Sub netclient_start()
Set NetDataClient1 = CreateObject("netdata.NetDataClient")
NetDataClient1.Start "127.0.0.1", "8899" '只是测试用,我没用写配置文件
End Sub
建窗体1:
代码如下:
Option Explicit
Private Sub FillData() '绑定窗体的子程序
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
         With rs
                .LockType = adLockOptimistic
                .CursorLocation = adUseClient
        End With
   Set rs = NetDataClient1.Execute("select * from 测试表")      '获取查询数据返回的recordset
   If rs Is Nothing Then MsgBox "网络连接不成功,请开启服务端程序"
   If Not (rs.EOF And rs.BOF) Then Set Me.Recordset = rs  '窗口绑定recordset数据
End Sub
Private Sub Form_Open(Cancel As Integer)
Call netclient_start
Call FillData
End Sub

Private Sub Form_Unload(Cancel As Integer)
NetDataClient1.Down
End Sub

菜鸟的悲哀{:soso_e136:},数据绑定折腾我很久啊。

下一次讲 逐条式更新。和坑爹式批量更新

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
3#
 楼主| 发表于 2013-11-7 20:53:59 | 只看该作者
本帖最后由 ganlinlao 于 2013-11-9 21:43 编辑

菜鸟级逐条式更新

在使用netdata客户端的时候,一定要有几点清醒的认识。
1、你的窗体没有表或查询可以直接绑定。access最善长的就是直接绑定表或查询。
但你现在远离了微软大妈温暖的怀抱,瑟瑟地冲进了非绑定的暗黑世界。
2、你的数据库在遥远的server端。使用的recordset永远只能是aduseclient模式。
这意味它是断开的记录集,跟数据库没有任何的关联。别人的修改和更新,你看不见
除非你重新获得一个新的recordset。你的修改和更新也无法自动存入数据库,除非你手动传
回数据。
3、Access窗口的数据更改,不会自动更改你的recordset。你只能手动更新你的内存中recordset数据。
并且得重新绑定窗口。
4、数据传回Server端,写入数据库时,永远都有存在数据冲突的可能。一定要做好保护,虽然现在
有无痛人流,但其实还是很痛的。
5、最后偷偷说一下,狗日的微软练法轮平台大法时,掉阴沟里去了。在win8上用vb6 编译exe,ADO最好选6.1,否则程序会走火入魔。
(唉,说不定是我走火入魔了)

逐条式更新菜鸟级代码

模块1中的代码
Option Compare Database
Option Explicit
Public NetDataClient1 As Object
Public Sub netclient_start()
If NetDataClient1 Is Nothing Then
Set NetDataClient1 = CreateObject("netdata.NetDataClient")
NetDataClient1.Start "127.0.0.1", "8899" '只是测试用,我没有写配置文件,要写Server端的IP和端口 . 这里写的IP是本机
Else
NetDataClient1.Down
Set NetDataClient1 = Nothing
End If
End Sub
Public Function StringReg(str As String, RegType As String)  '用正则做了一个简单的匹配,用于数据安全性检查
Dim reg As Object
Set reg = CreateObject("vbscript.RegExp")
Select Case RegType
         Case "只能中文"
         reg.Pattern = "^[\u4e00-\u9fa5]{0,}$"
         Case "只能数字"
          reg.Pattern = "^[0-9]*$"
         Case "只能数字英文"
         reg.Pattern = "^[A-Za-z0-9]+$"
         Case "只能英文"
         reg.Pattern = "^[A-Za-z]+$"
         Case "Email"
         reg.Pattern = "^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$"
         Case "URL"
         reg.Pattern = "^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$"
         Case "电话号码"
         reg.Pattern = "^((d{3,4})|d{3,4}-)?d{7,8}$"
         Case "身份证号"
         reg.Pattern = "^d{15}|d{}18$"
End Select
With reg
            .IgnoreCase = True   ' 设置是否区分大小写。
            .Global = True       '全程匹配
End With
StringReg = reg.test(str)
Set reg = Nothing
End Function

窗体1中的代码

Option Compare Database
Option Explicit
Private rst As New ADODB.Recordset
Private Sub FillData() '绑定窗体的子程序
         With rst
                .CursorLocation = adUseClient   '安全起见定义一下游标类型
                .LockType = adLockOptimistic    '锁定类型也是此种唯一可用
        End With
   Set rst = NetDataClient1.Execute("select  * from 测试表")
   If rst Is Nothing Then MsgBox "网络连接不成功,请开启服务端程序"
   If Not (rst.EOF And rst.BOF) Then Set Me.Recordset = rst
   rst.AddNew                      '允许添加新记录。注意:在设计非绑定窗口时,一定要把允许添加 选为否. 如果选为是,会导致窗口的新记录会  绑到空的记录指针,窗口会崩溃。估计是窗体属性优先于后期绑定的recordset.我对此也是一头雾水。
End Sub

Private Sub DelRecord_Click()
If Me!Text0.Value = "" Or IsNull(Me!Text0.Value)  Then
Exit Sub
Else
NetDataClient1.SendQuery ("DELETE * from 测试表 where 姓名='" & Me!Text0.Value & "'")
rst.Delete
rst.Update
Me.Refresh
Set Me.Recordset = rst
End If
End Sub

Private Sub SaveNew_Click()
If IsNull(Me!Text0.Value) Or Me!Text0.Value = "" Then '在这里只是简单地判断  主键 "姓名"不能为空
MsgBox "姓名必须填写"
Exit Sub
Else
rst.Fields("姓名") = Me!Text0.Value
rst.Fields("年龄") = Me!Text2.Value
rst.Fields("性别") = Me!Text4.Value
rst.Fields("身高") = Me!Text6.Value
rst.Fields("嗜好") = Me!Text8.Value
rst.Fields("备注") = Me!Text10.Value
rst.Update                  '更新内存中的Recordset,这没办法更新到数据库
NetDataClient1.SendQuery ("insert into 测试表 (姓名,年龄,性别,身高,嗜好,备注)   VALUES  ('" & Me!Text0.Value & "','" & Me!Text2.Value & "','" & Me!Text4.Value & "','" & Me!Text6.Value & "','" & Me!Text8.Value & "','" & Me!Text10.Value & "')")
'传回数据到Server端,更新数据库中的表 . 跟本地的SQL用法一模一样
Me.Refresh                  '刷新窗口
Set Me.Recordset = rst   'Recordset重新绑定窗口
rst.AddNew             '允许重新添加一条新记录
End If
End Sub
Private Sub Text0_KeyPress(KeyAscii As Integer)  '姓名只能输入中文  数据安全性检查,图省事,在此通通略去
If KeyAscii <> 8 And Not StringReg(Chr(KeyAscii), "只能中文") Then
    KeyAscii = 0
End If
End Sub
Private Sub UpdateRecord_Click()   '更新记录
Dim ctl As Control
For Each ctl In Me.Controls     '遍历窗体控件
If ctl.ControlType = acTextBox Then   '判断窗体控件类型, 这里是单一类型。多类型用select case
If ctl.Value <> ctl.OldValue Then       '判断数据有没有更改
rst.Fields("姓名") = Me!Text0.Value    '这里姓名是主键,只能删除或添加
rst.Fields("年龄") = Me!Text2.Value
rst.Fields("性别") = Me!Text4.Value
rst.Fields("身高") = Me!Text6.Value
rst.Fields("嗜好") = Me!Text8.Value
rst.Fields("备注") = Me!Text10.Value
rst.Update               '更新窗体数据到本地缓存的recordset
NetDataClient1.SendQuery ("UPDATE 测试表 SET 年龄='" & Me!Text2.Value & "', 性别='" & Me!Text4.Value & "', 身高='" & Me!Text6.Value & "', 嗜好='" & Me!Text8.Value & "', 备注='" & Me!Text10.Value & "'  where 姓名='" & Me!Text0.Value & "'")
'更新数据到服务端的数据库
Me.Refresh    '刷新窗体'
Set Me.Recordset = rst    '重新绑定窗体,记住一定要重新绑定。
Exit For
End If
End If
Next
End Sub
Private Sub Form_Open(Cancel As Integer)
Call netclient_start
Call FillData
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call netclient_start
End Sub


以后有机会再试讲一下,坑爹式批量更新、图片、视频二进制数据的传递、
单端口多数据库管理、第三方握手点对点,只是还有以后吗?{:soso_e136:}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

点击这里给我发消息

4#
发表于 2013-11-7 20:59:51 | 只看该作者
顶起................................
回复

使用道具 举报

点击这里给我发消息

5#
发表于 2013-11-7 21:13:19 | 只看该作者
看来冬瓜解决数据表绑定了

点击这里给我发消息

6#
发表于 2013-11-8 09:59:22 | 只看该作者
顶一下!!
回复

使用道具 举报

点击这里给我发消息

7#
发表于 2013-11-8 10:42:26 | 只看该作者
上次 听冬瓜介绍了这个NetData,已经在一些客户的系统测试过这个
有好处,也有缺点,但总体上还是一种不错的解决方案.
赞一下!

点击这里给我发消息

8#
发表于 2013-11-8 11:03:54 | 只看该作者
突然发现,冬瓜的文采与老汉 有得一比啊. 而且 也是出整套 系列

点击这里给我发消息

9#
发表于 2013-11-9 12:52:42 | 只看该作者
谢谢分享, 标记一下
10#
发表于 2013-11-15 21:13:00 | 只看该作者
老兄很幽默
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-20 16:04 , Processed in 0.101162 second(s), 37 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表