好的,所以我从a question开始,根据本网站和其他人的建议对代码进行了很多更改,所以我想我应该创建一个新问题。
即使我的代码更短,效率更高,同样的问题仍然存在;我正在使用一个名为strSQL的字符串,其中包含我要执行的INSERT语句。我有一个FOR EACH循环遍历我的MSAcess表单上的每个控件(确保它们是文本框,下拉列表或复选框)并确定该字段是否已更改。如果有,它会生成一个查询字符串来记录更改 - 并将其存储在strSQL中。
问题是一次又一次地执行相同的查询。我在执行查询字符串的行之前和之后添加了一个DEBUG.PRINT语句,调试器显示该字符串已更改!是的,你读得对,这似乎是不可能的,但我已经截了屏幕。
首先是我的代码:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim C As Control
For Each C In Controls
Select Case C.ControlType
Case acTextBox, acComboBox, acCheckBox
Dim strOriginalValue, strCurrentValue, strSQL As String
strOriginalValue = IIf(IsNull(C.OldValue), "", IIf(C.OldValue = vbTrue Or C.OldValue = vbFalse, IIf(C.OldValue = vbTrue, "Yes", "No"), C.OldValue))
strCurrentValue = IIf(IsNull(C.Value), "", IIf(C.Value = vbTrue Or C.Value = vbFalse, IIf(C.Value = vbTrue, "Yes", "No"), C.Value))
If strOriginalValue <> strCurrentValue Then
strSQL = "INSERT INTO fringefestival_changes (change_time,change_admin,action_taken,user_affected,year_affected,field_affected,type_affected,old_value,new_value) VALUES (NOW(),'" & ThisUserName() & "','Edit'," & [id] & ",0,'" & C.ControlSource & "','Administrator','" & Replace(strOriginalValue, "'", "") & "','" & Replace(strCurrentValue, "'", "") & "')"
Debug.Print "Before: " & strSQL
CurrentDb.Execute strSQL, dbFailOnError
Debug.Print "After: " & strSQL
End If
End Select
Next
End Sub
以下是调试器的结果:
Before: INSERT INTO fringefestival_changes (change_time,change_admin,action_taken,user_affected,year_affected,field_affected,type_affected,old_value,new_value) VALUES (NOW(),'ajohnson','Edit',3,0,'indoor_performers_tab','Administrator','No','Yes')
After: INSERT INTO fringefestival_changes (change_time,change_admin,action_taken,user_affected,year_affected,field_affected,type_affected,old_value,new_value) VALUES (NOW(),'ajohnson','Edit',3,0,'indoor_performers_tab','Administrator','No','Yes')
Before: INSERT INTO fringefestival_changes (change_time,change_admin,action_taken,user_affected,year_affected,field_affected,type_affected,old_value,new_value) VALUES (NOW(),'ajohnson','Edit',3,0,'volunteers_tab','Administrator','No','Yes')
After: INSERT INTO fringefestival_changes (change_time,change_admin,action_taken,user_affected,year_affected,field_affected,type_affected,old_value,new_value) VALUES (NOW(),'ajohnson','Edit',3,0,'volunteers_tab','Administrator','No','Yes')
其次是我的截图...首先是调试器:1&amp; 2其次是结果:here - 请注意调试器太宽,所以我拍了两张截图,结果有一行颜色,因为它与此问题无关。
请注意,我提供的示例中唯一应该不同的列应该是“field_affected”列。
我完全失去了,我不知道为什么它会将正确的字符串输出到调试器并执行其他操作。
编辑:在使用CurrentDb.Execute之前,我使用的是DoCmd.RunSQL,但这需要我禁用然后重新启用警告。由于两者的结果相同(相同的错误),我使用的是单行解决方案而不是三行解决方案。
更新:为了帮助我意识到数据确实被正确插入而向Shoutout发送到shahkalpesh我可以在SQL Server的管理工作室中看到它,但MS Access仍然显示错误...问题是为什么?
最终编辑:通过向表中添加一个标识/自动增量整数列来修复,我怀疑缺少不同的字段值会让MSAccess感到困惑(虽然它确实没有理由) - 这里的士气是M $是愚蠢的
答案 0 :(得分:1)
有问题的表单是否绑定到数据源?这是Access最常用的方式,如果是这样的话,你可能不需要通过SQL进行更新。
当表单绑定到数据源时,通常使用Form_BeforeUpdate()。您通常不会使用此事件来确定控件的值是否已更改并需要写回DB ...
答案 1 :(得分:1)
如果您可以转到特定的SQL Server表(使用查询分析器或Enterprise Mgr)&amp;看它是否按预期工作。我怀疑VBA中的链接表可能会显示错误的图片。
编辑:如果您有SQL事件探查器,请查看正在执行的内容,以确认您对执行相同查询的疑问。
答案 2 :(得分:0)
你对currentdb运行那些查询(假设我是access-db),但实际上是在使用SQL服务器数据库,你希望更改发生在哪里?
sql server中的那些表是否链接到access-db中的表或者你使用的是什么方法?
答案 3 :(得分:0)
您是否检查过表格是否有破损的触发器?这是一个很长的镜头,但之前有一些非常奇怪的问题是由坏/破坏的触发引起的,而且在你注意到触发器之前它们很难理解......
答案 4 :(得分:0)
通过向更改表添加自动递增的整数主键列来修复。
愚蠢的访问...
答案 5 :(得分:-1)
啊,你也在使用SQL Server。我非常幸运使用触发器来审计Access背后的数据更改。有一些怪癖,但使用受信任的身份验证通过ODBC链接表格非常容易。
好的,所以你不能或不想使用触发器。当使用Access前端SQL时,我通常在我的VBA代码中使用ADO对象来处理这类事情。使用ODBC的链接表非常适合绑定表单,但没有什么能比ADO直接转到SQL Server。
您是否想了解有关使用受信任的身份验证链接表的更多信息,或者是否有助于使用ADO与SQL Server一起工作?
答案 6 :(得分:-1)
我不得不说围绕这个问题的讨论让我发疯。使用ODBC链接表,您可以从绑定表单开始。没有理由使用池化连接。如果您对如何执行这些操作的Access实现持敌对状态,请停止使用ACCESS。