|
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
|