Хорошо, поэтому я начал с вопроса и внес много изменений в код, основываясь на предложениях этого сайта и других, поэтому я решил, что должен создать новый вопрос.
Несмотря на то, что мой код короче и эффективнее, такая же проблема сохраняется; Я использую строку с именем strSQL, которая содержит инструкцию INSERT, которую я хочу выполнить. У меня есть цикл FOR EACH, который проходит через каждый элемент управления в моей форме MSAcess (гарантирует, что это текстовое поле, раскрывающийся список или флажок) и определяет, было ли изменено поле. Если он есть, он генерирует строку запроса для регистрации изменений и сохраняет ее в strSQL.
Проблема в том, что один и тот же запрос выполняется снова и снова. Я добавил оператор DEBUG.PRINT до и после строки, которая выполняет строку запроса, и отладчик показывает, что строка CHANGED! Да, вы правильно прочитали, это кажется невозможным, но я сделал скриншоты.
Сначала мой код:
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 & 2 , а во-вторых, результаты: здесь - обратите внимание, что отладчик слишком широк, поэтому Я сделал два снимка экрана, и его результаты закрашены рядом, поскольку это никак не связано с этой проблемой.
Обратите внимание, что единственным столбцом, который должен отличаться в приведенном мной примере, должен быть столбец "field_affered".
Я в полной растерянности, я понятия не имею, почему он выведет правильную строку в отладчик и выполнит что-то еще.
РЕДАКТИРОВАТЬ: Перед использованием CurrentDb.Execute я использовал DoCmd.RunSQL, но это потребовало от меня отключить, а затем снова включить предупреждения. Поскольку результат был одинаковым для обоих (одна и та же ошибка), я использовал однострочное решение вместо трехстрочного.
ОБНОВЛЕНИЕ: Привет shahkalpesh за помощь в понимании того, что данные действительно вставляются правильно, и я вижу их в студии управления SQL Server, но MS Access по-прежнему отображает их неправильно ... вопрос почему?
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Исправлено добавлением в таблицу целочисленного столбца идентификаторов / автоинкрементов. Я подозреваю, что отсутствие различных значений полей сбивало с толку MSAccess (хотя на самом деле нет причин для этого) - мораль здесь это M $ глупо