Currentdb.Execute với dbFailonError không gặp lỗi
Trong Access 2003-2016, tôi đang sử dụng CurrentDb.Execute với dbFailonError để chạy câu lệnh INSERT. Câu lệnh INSERT sẽ không thành công (và đúng như vậy) vì một trường có giá trị không chính xác dựa trên bảng có liên quan với "Tính toàn vẹn tham chiếu bắt buộc". Tuy nhiên, nó không tạo ra một lỗi. Tôi đã thử tạo lại sự cố này trong cơ sở dữ liệu mới và lỗi hoạt động chính xác. Có điều gì đó sai trong cài đặt với cơ sở dữ liệu hiện tại của tôi và tôi không muốn tạo lại nó từ đầu. Tôi đã lấy mọi thứ ra khỏi cơ sở dữ liệu của mình ngoại trừ phần có vấn đề và cơ sở dữ liệu ví dụ có thể tái tạo tối thiểu của tôi nằm ở liên kết này .
Đây là mã của tôi, nhưng vấn đề là mã này hoạt động tốt và gây ra lỗi khi tôi tạo cơ sở dữ liệu mới từ đầu. Nó chỉ không hoạt động trong cơ sở dữ liệu hiện tại của tôi.
Private Sub Command34_Click()
Dim testsql As String
testsql = "INSERT INTO tblObservations (Site,TotalDepth) VALUES ('SUD-096',5)"
With CurrentDb
On Error GoTo Err_Execute
.Execute testsql, dbFailOnError
On Error GoTo 0
MsgBox ("Upload completed. " & .RecordsAffected & " records added.")
End With
Exit Sub
Finish:
Exit Sub
Err_Execute:
If DBEngine.Errors.Count > 0 Then
For Each errLoop In DBEngine.Errors
MsgBox ("Error number: " & errLoop.Number & vbCr & errLoop.Description)
Next errLoop
End If
Resume Finish
End Sub
Trả lời
Sử dụng Option Explicit, như Hans đã nói. Luôn luôn sử dụng Option Explicit!
Bạn thiếu tham chiếu đến đối tượng Microsoft Office ##. # Access Database Engine. Đây là nơi dbFailOnErrorđược xác định. Bởi vì bạn không có tham chiếu đó, dbFailOnErrorkhông được xác định. Tham chiếu này được thêm vào tất cả cơ sở dữ liệu Access theo mặc định và tôi thực sự khuyên bạn nên thêm nó.
Và bởi vì bạn không sử dụng Option Explicit, VBA không bận tâm rằng nó không được xác định và chỉ chuyển biến không xác định đó thành 0.
Nếu vì lý do nào đó, bạn không muốn thêm tham chiếu, hãy sử dụng giá trị tương ứng cho dbFailOnError:
.Execute testsql, 128