设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2145|回复: 9
打印 上一主题 下一主题

[ADO/DAO] 求教更简练的ADO保存语句

[复制链接]
跳转到指定楼层
1#
发表于 2011-9-26 16:53:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中午突然想到一个有可能遇到的问题:
在用ADO保存记录时,如果窗体里有N个字段(几十个甚至更多),如下例:
        Dim Stemp As String
        Dim rs As ADODB.Recordset
        Set rs = New ADODB.Recordset

        Stemp = "SELECT [tbl销售表].* FROM [tbl销售表] WHERE 货物编码 = '" & Me.货物编码 & "'"
        rs.Open Stemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
            With rs
                ![类别] = Me.类别
                ![单价] = Me.单价
                ![金额] = Me.金额
                如果下面还有几十个字段
                .Update
            End With
虽然简单,但代码会写到手软……

不知道有没有简洁的语句,窗体里无论有多少个字段都保存到表里?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-9-26 17:25:28 | 只看该作者
方法1:将需要使用的控件的标记属性统一设置为一个值(属性-其他-标记),例如"1"
dim ctl as control
for each ctl in me.controls
if ctl.tag=1 then rs(ctl.name)=ctl.value
next

方法2:控件重新命名为数字编号
for i = 1 to 10
rs(me.controls(i).name)=me.controls(i)
next

方法3:前提是rs的字段标题和控件名称一致
for i= 0 to rs.fields.count-1
rs(i)=me.controls(rs(i).name)
next

点评

多谢提点,不过TODAYNEW版主的似乎简单些,呵呵……  发表于 2011-9-27 14:32
3#
发表于 2011-9-26 19:35:07 | 只看该作者
Dim Stemp As String
Dim rs As New ADODB.Recordset
Dim ctrl as control
Stemp = "SELECT [tbl销售表].* FROM [tbl销售表] WHERE 货物编码 = '" & Me.货物编码 & "'"
rs.Open Stemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
for each ctrl in me.controls
    rs.fields(ctrl.name).value=ctrl.value
next ctrl
rs.update

反过来用字段名找控件也可以。
运用时,注意用if来排除某些字段类型(如标签、按钮、子窗体控件等)和某些不是表中字段的控件。
4#
发表于 2011-9-26 19:42:30 | 只看该作者
学习了

点击这里给我发消息

5#
发表于 2011-9-26 21:14:13 | 只看该作者
直接绑定到窗体上,不更简单吗?
6#
 楼主| 发表于 2011-9-27 14:29:28 | 只看该作者
zhuyiwen 发表于 2011-9-26 21:14
直接绑定到窗体上,不更简单吗?

回老师的话,因为怕光标跑到别的记录造成数据错误,所以我用的未绑定窗体,呵呵……
7#
 楼主| 发表于 2011-9-27 14:30:29 | 只看该作者
本帖最后由 紫风 于 2011-9-27 14:36 编辑
todaynew 发表于 2011-9-26 19:35
Dim Stemp As String
Dim rs As New ADODB.Recordset
Dim ctrl as control


多谢版主指点!

不过,我没试过这个方法,应该如何用if避开呢?(假设窗体里有一个标签lbl_cmdSave和一个按钮cmdSave)
8#
发表于 2011-9-27 14:38:40 | 只看该作者
  1. Dim Stemp As String
  2.     Dim rs As New ADODB.Recordset
  3.     Dim ctrl As Control
  4.     Stemp = "SELECT [tbl销售表].* FROM [tbl销售表] WHERE 货物编码 = '" & Me.货物编码 & "'"
  5.     rs.Open Stemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  6.     For Each ctrl In Me.Controls
  7.         If TypeOf ctrl Is TextBox Then
  8.             rs.Fields(ctrl.Name).Value = ctrl.Value
  9.         End If
  10.     Next ctrl
  11.     rs.Update
复制代码
9#
 楼主| 发表于 2011-9-27 14:42:08 | 只看该作者
Henry D. Sy 发表于 2011-9-27 14:38

哇哇哇,多谢版主!学习了!
10#
发表于 2012-1-4 10:49:16 | 只看该作者
学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-3 17:27 , Processed in 0.093395 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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