【问题标题】:Microsoft Access Checkbox with SQL Backend Does Not Update带有 SQL 后端的 Microsoft Access 复选框不更新
【发布时间】:2015-12-20 01:13:20
【问题描述】:

我一直在研究它,发现了许多类似的案例……但没有一个完全相同。在前面提到的案例中,我尝试了很多不同的解决方案,但没有一个解决了这个问题。

我最近刚刚进行了 SQL Server 迁移,现在正在对新 SQL 后端出现的问题进行故障排除。这是我想不通的最后一个:

我有一个带有复选框控件的拆分表单,通过 DSN-Less 连接绑定到 SQL Server 视图。在迁移之前无法更新绑定访问查询......所以我使用两种不同的方法通过 VBA 以编程方式更新了表单复选框:

  1. 是一个选中所有/不选中复选框,单击时选中或取消选中数据表中的所有复选框。

  2. 让用户能够通过使用复选框 Mouse_Down 事件来选中或取消选中每个单独的复选框。

以下是这两种方法的代码:

    ' Check All/ Check None
    Dim rsSelect As DAO.Recordset
    Dim rsUpdate As DAO.Recordset
    Dim SQL As String
    Dim CurrDb As Database
    Dim currFilter As String

On Error GoTo chkSelect_Click_Error

   ' Capture current filter
    If Me.FilterOn Then currFilter = Me.Filter
    Set rsSelect = Me.RecordsetClone

    Set CurrDb = CurrentDb

     rsSelect.MoveFirst
    Do While Not rsSelect.EOF
         SQL = "SELECT * FROM tblTimesheet WHERE [TimesheetID] = " & rsSelect("TimesheetID")
        Set rsUpdate = CurrDb.OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)
        If Not rsUpdate.EOF Then
            If Me.chkSelect Then
                With rsUpdate
                    .Edit
                    rsUpdate("TimesheetSelect") = True
                    .Update
                End With
            Else
                 With rsUpdate
                    .Edit
                    rsUpdate("TimesheetSelect") = False
                    .Update
                End With
            End If
        End If
        rsSelect.MoveNext
     Loop
    rsUpdate.Close
    rsSelect.Close
    Me.Requery
    If currFilter > "" Then
        Me.Filter = currFilter
        Me.FilterOn = True
    End If
    If Me.chkSelect Then
        Me.lblSelect.Caption = "Select None"
    Else
        Me.lblSelect.Caption = "Select All"
    End If

   On Error GoTo 0
   Exit Sub

chkSelect_Click_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure chkSelect_Click of VBA Document Form_frmTimesheetSummary"

其次:

    ' Check/ Uncheck Individual Checkbox
    Dim rsUpdate As DAO.Recordset
    Dim SQL As String
    Dim CurrDb As Database
    Dim currFilter As String

   ' Capture current filter
    If Me.FilterOn Then currFilter = Me.Filter

    Set CurrDb = CurrentDb
     SQL = "SELECT * FROM tblTimesheet WHERE [TimesheetID] = " & Me.TimesheetID
    Set rsUpdate = CurrDb.OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)
    If Not rsUpdate.EOF Then
        If Me.TimesheetSelect Then
            With rsUpdate
                .Edit
                rsUpdate("TimesheetSelect") = False
                .Update
            End With
        Else
             With rsUpdate
                .Edit
                rsUpdate("TimesheetSelect") = True
                .Update
            End With
        End If
    End If


    rsUpdate.Close
    Me.Form.Requery
    'Me.Repaint
    Me.Refresh
    If currFilter > "" Then
        Me.Filter = currFilter
        Me.FilterOn = True
    End If

这两个程序都与 Access 后端一起工作......但“检查个人”程序现在拒绝工作。当我选中一个复选框时,它确实更新了 SQL 后端......但控件本身拒绝更新新状态......我当然尝试过 Requery,但也尝试过 Repaint 和 Refresh,它拒绝更新,除非我完全关闭表单然后重新打开。

这一切的真正关键在于 Check All 方法仍然有效!我在这上面花了几个小时,希望能对它有一些新的看法,因为如果后端正在更新,它应该可以工作!!

稍后添加的附加说明:作为对以下一些重要理由的回应,我觉得我应该包括这些附加说明:

  1. 我正在使用 SQL Server 2012 和 SQL Server Native Client 11.0 驱动程序作为连接字符串。

  2. 我使用的是 Microsoft Access 2010 32 位

  3. SQL Server 字段有点我已经删除了所有空值并将允许空值设置为“否”,默认值为 0

【问题讨论】:

  • 我目前没有可用的旧笔记,但是当我们转换为 SQL Server 时处理布尔值时,我似乎记得您的问题。我认为解决方案是使用 0 或 1 而不是 True False。我会尝试找到我的转换记录...
  • 还没老... :) 查看:blogs.msdn.com/b/ssma/archive/2011/03/06/… 并找到:处理布尔值、位和 True
  • @WayneG.Dunn:但是如果TimesheetSelect 是数据类型bit,第一个过程不是也不起作用吗?
  • @Andre:我太专注于“移至 SQL Server...”,并且正在查看对 True/False 的“一些”引用,这些引用仍然需要更改。我应该更好地阅读这个问题。所以,'TimesheetSelect' 是一个绑定控件并且没有被更新。 Anthony,您对一个使用“Click”事件,而对另一个使用“MouseDown”?您是否知道“TimesheetSelect”的值在 MouseDown 触发后才会改变?所以你对 True 的检查是关闭的。
  • @WayneG.Dunn 感谢您的回复。我试过 True/False、-1/0 和 1/0,它们都产生相同的结果。不同事件的原因是 Check All 未绑定,因此 click 事件有效。 Check Individual 绑定到一个可更新的记录集,因此 Click 事件永远不会触发,因为记录集无法更新......因此我不得不将它放在 Mouse Down 事件中。

标签: sql-server vba ms-access


【解决方案1】:

想到了一些事情:

1) 您可以将第二个过程中的整个 rsUpdate 构造替换为:

SQL = "UPDATE tblTimesheet SET TimesheetSelect = " & _
      IIf(Me.TimesheetSelect, "0", "-1") & _
      " WHERE TimesheetID = " & Me.TimesheetID
CurrDb.Execute SQL, dbSeeChanges

您应该使用“-1”还是“1”取决于您的TimesheetSelect 数据类型。

2) Me.Form.Requery 应该是 Me.Requery

3) 如果它仍然不起作用,将 TIMESTAMP 列添加到 tblTimesheet 可能有助于 Access 识别记录已更改。这通常是一件好事,但不应该是必要的。

推荐阅读:https://stackoverflow.com/a/2861581/3820271
tblTimesheet有主键,不是吗?

【讨论】:

  • 好主意,我没有想过通过 SQL 执行更新...我现在就试试看。是的... Me.Form.Requery 不是最初的样子...这只是反映了我多次尝试让表单重新查询因此我也尝试过 Docmd.Requery 最后是 Me.Form.Requery ...是的,该表同时具有时间戳和主键。数据类型也有点。
  • 搞砸了......它也没有得到它。
  • @AnthonyGriggs:如果数据类型为bit,则需要使用1,而不是True-1。您说您尝试过,但也许将您问题中的代码更新为当前版本?
【解决方案2】:

如果 Andre 的建议没有解决问题,请尝试重置表单的记录源,而不是 Me.Requery。我. 记录来源 = 。 您没有说您使用的是什么版本的 SQL Server 或哪个 ODBC 驱动程序。确保您使用的是适用于您的 SQL Server 版本的正确 ODBC 驱动程序,而不是默认的“SQL Server”驱动程序。

【讨论】:

  • 好点。我正在使用带有 SQL Server Native Client 11.0 驱动程序的 SQL Server 2012...在解决日期问题时,我已经在我的 DSN-Less 连接字符串中调整了默认 SQL Server 驱动程序的错误。
  • 重置记录源是另一个好主意...但不幸的是在这种情况下不起作用。
  • 尝试在重新查询或重置记录源之前添加DBEngine.Idle dbRefreshCache。
【解决方案3】:

感谢所有发布的人...在这种情况下对我有用的答案是放弃拆分表单...我听说拆分表单有时会出现问题,因此在标准父级中重新设计了表单/ 完全解决问题的子表单设置。

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多