【发布时间】:2015-12-20 01:13:20
【问题描述】:
我一直在研究它,发现了许多类似的案例……但没有一个完全相同。在前面提到的案例中,我尝试了很多不同的解决方案,但没有一个解决了这个问题。
我最近刚刚进行了 SQL Server 迁移,现在正在对新 SQL 后端出现的问题进行故障排除。这是我想不通的最后一个:
我有一个带有复选框控件的拆分表单,通过 DSN-Less 连接绑定到 SQL Server 视图。在迁移之前无法更新绑定访问查询......所以我使用两种不同的方法通过 VBA 以编程方式更新了表单复选框:
是一个选中所有/不选中复选框,单击时选中或取消选中数据表中的所有复选框。
让用户能够通过使用复选框 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 方法仍然有效!我在这上面花了几个小时,希望能对它有一些新的看法,因为如果后端正在更新,它应该可以工作!!
稍后添加的附加说明:作为对以下一些重要理由的回应,我觉得我应该包括这些附加说明:
我正在使用 SQL Server 2012 和 SQL Server Native Client 11.0 驱动程序作为连接字符串。
我使用的是 Microsoft Access 2010 32 位
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