如何让 Recordset #2 与相似 Recordset#1 处于相同位置

Posted

技术标签:

【中文标题】如何让 Recordset #2 与相似 Recordset#1 处于相同位置【英文标题】:How to Let Recordset #2 in the Same Position as the Similar Recordset#1 【发布时间】:2015-05-24 07:33:18 【问题描述】:

我正在使用 2 个记录集:#1 和 #2。记录集 #1 是表单记录集,它不是 DataUpdatable,因为它的源是带有不可编辑字段的查询。记录集 #2 是 DataUpdatable,因为它的源是一个表。记录集#2 表是记录集#1 表源。

每次保存表单的控件值时,我都会将记录集状态更改为添加/编辑,将每个值粘贴到其各自的记录集字段中并更新记录集。问题是我必须在记录集 #2 中执行此操作,因为 #1 不可编辑。我需要在粘贴控件值之前将记录集#2 位置移动到相同的#1 位置。我正在尝试在记录集 #2 中使用记录集 #1 书签,因为它们具有相同的表结构、字段总数等......但它说书签无效。

两个记录集的顺序相同,两个 SQL 源都有“ORDER BY”子句。 AddNew 模式没有问题,因为记录集位置是新的,不需要查找。问题出在 EditInProgress 模式,因为我必须匹配两个位置,这样我才能将针对记录集 #1 字段的表单控件值更新为等效的记录集 #2 字段。

提前致谢。

嗨,AVG。这是加密/解密代码:

Public Function EncriptarDecriptarTexto(textoNormal As Variant) As Variant
    On Error GoTo ErroGeral
    Dim posicaoLetraEncript As Integer
    Dim valorLetraEncript As Integer
    Dim tamanhoTextoNormal As Integer
    Dim tamanhoTextoEncript As Integer
    Dim textoEncript As String
    Dim i As Integer

    If ((textoNormal & "") = "") Then
        GoTo ErroGeral
    End If

    tamanhoTextoNormal = Len(textoNormal)
    tamanhoTextoEncript = Len(textoEncript)
    posicaoLetraEncript = 0
    textoEncript = "Any text you want"

    For i = 1 To tamanhoTextoNormal
        posicaoLetraEncript = posicaoLetraEncript + 1

        If posicaoLetraEncript > tamanhoTextoEncript Then
            posicaoLetraEncript = 1
        End If

        valorLetraEncript = Asc(Mid(textoEncript, posicaoLetraEncript, 1))
        Mid(textoNormal, i, 1) = Chr(Asc(Mid(textoNormal, i, 1)) Xor valorLetraEncript)
    Next i

    EncriptarDecriptarTexto = textoNormal

Sair:
    Exit Function
ErroGeral:
    EncriptarDecriptarTexto = Null
    GoTo Sair
End Function

关于表更新:我现在正在通过 INSERT/UPDATE 语句进行更新。

【问题讨论】:

AVG 是对的。修正设计。不可编辑的字段不会停止任何事情,因为无论如何您都不会更新这些字段。如果您聚合了值,请从外部连接中提取这些值。 【参考方案1】:

这听起来像是糟糕的设计。也就是说,无需打开第二个记录集并尝试与表单的记录源同步,只需使用更新语句即可。 Update <YourTable> SET <field1> = <NewValue1>, <field2> = <NewValue2> WHERE <PK>=<CurrentRecordPK>

【讨论】:

我在保存到表格之前对数据进行了加密,并在表单的查询源中使用了一个函数来解密这些数据并提供绑定控件。这就是表单的记录集不可编辑的原因。我可以通过使用 .FindFirst 方法来勾勒这种情况,但我想以某种方式使用 .Bookmark,尽管在这种情况下它是不兼容的。 书签不起作用,因为记录集不同,句号。见msdn.microsoft.com/en-us/library/office/ff823084.aspx。像我提议的那样使用更新语句有什么问题? 好的 AVG,我理解你的代码,它很聪明。我想要的是避免使用 WHERE 子句,因为我的代码是通用的,它适用于任何类型的表结构 - 相同的代码保存任何类型的记录集。现在,如果我使用 WHERE 子句,我的代码将失去通用性。 雷神,你正在尝试做的事情非常低效。您正在打开另一个记录集,其中包含表单记录源中的所有记录,将所有这些记录拖过网络(假设您在网络上),只是为了更新一条记录。它可能看起来很酷,但根本没有意义。一个简单的更新语句不需要那么通用。 AVG,我的代码是通用的。它非常有效。到目前为止,它适用于任何类型的表结构。你告诉我一种将表单控件中的加密文本保存到表格中的有效方法,反之亦然,保持通用属性。

以上是关于如何让 Recordset #2 与相似 Recordset#1 处于相同位置的主要内容,如果未能解决你的问题,请参考以下文章

MS-Access Recordset to Array,值被转置

VB6 ADODB.Recordset RecordCount 属性总是返回 -1

一个关于在VB中将Recordset 读出的内容放到一个数组变量中的问题!!

Form.Recordset 属性(访问)

如何从类外的 RecordSet 中返回值?

如何从此 ADODB.Recordset 中获取插入 ID?