Office中国论坛/Access中国论坛

标题: 求教更简练的ADO保存语句 [打印本页]

作者: 紫风    时间: 2011-9-26 16:53
标题: 求教更简练的ADO保存语句
中午突然想到一个有可能遇到的问题:
在用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
虽然简单,但代码会写到手软……

不知道有没有简洁的语句,窗体里无论有多少个字段都保存到表里?

作者: yehf    时间: 2011-9-26 17:25
方法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-26 19:35
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来排除某些字段类型(如标签、按钮、子窗体控件等)和某些不是表中字段的控件。

作者: cjnt007    时间: 2011-9-26 19:42
学习了
作者: zhuyiwen    时间: 2011-9-26 21:14
直接绑定到窗体上,不更简单吗?
作者: 紫风    时间: 2011-9-27 14:29
zhuyiwen 发表于 2011-9-26 21:14
直接绑定到窗体上,不更简单吗?

回老师的话,因为怕光标跑到别的记录造成数据错误,所以我用的未绑定窗体,呵呵……
作者: 紫风    时间: 2011-9-27 14:30
本帖最后由 紫风 于 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)
作者: Henry D. Sy    时间: 2011-9-27 14:38
  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
复制代码

作者: 紫风    时间: 2011-9-27 14:42
Henry D. Sy 发表于 2011-9-27 14:38

哇哇哇,多谢版主!学习了!
作者: bpchan    时间: 2012-1-4 10:49
学习




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3