Access
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Access

Hãy cẩn thận những gì bạn theo dõi

Tôi đã xem câu trả lời này trên StackOverflow vào một ngày nọ và muốn thu hút sự chú ý về nó (tôi nhấn mạnh):

Tôi đã gặp sự cố này tự xuất hiện trong khi gỡ lỗi khi Tôi có một chiếc đồng hồ cố gắng trả lại mục của khóa "bị thiếu" . Trên thực tế, việc gỡ lỗi thất vọng hơn cũng gặp phải vấn đề tương tự khi tôi theo dõi [scriptingdictionaryObject] .exists () condtional); Tôi khuyên bạn nên thêm khóa "bị thiếu" do đồng hồ . Khi tôi tháo đồng hồ và thay vào đó tạo một trang tính tạm thời để sao chép mảng vào trong khi chạy, các khóa không mong muốn không còn được thêm vào.
Đối tượng từ điển thêm các mục trước .add () được gọi Tôi đang sử dụng đối tượng từ điển từ thư viện MS Scripting Runtime để lưu trữ một loạt các mảng và thực hiện các thao tác trên các ô của mảng khi cần thiết. Có một vòng lặp for để đi qua các quy trình ... Ngăn xếp Overflowriddley_w

Chuyện gì đang xảy ra ở đây?

Một trong những "tính năng" của đối tượng Từ điển là nó sẽ ngầm định tạo các mục mới mà không cần gọi phương thức .Add rõ ràng . Sự khác biệt giữa ẩn ý và rõ ràng là gì?

Lưu ý:Việc sử dụng giới hạn ban đầu đối tượng Từ điển yêu cầu tham chiếu đến "Microsoft Scripting Runtime" (chi tiết tại đây).

Dim MyDict As New Dictionary

'Explicit add
MyDict.Add "KeyA", "Item A"

'Implicit add
MyDict.Item("KeyB") = "Item B"

Debug.Print MyDict("KeyA"); vbNewLine; MyDict("KeyB")

Đây là phần có liên quan của tài liệu về ẩn tạo khóa:

Nhận xét
Nếu phím không tìm thấy khi thay đổi một mặt hàng , một khóa mới được tạo bằng newitem được chỉ định . Nếu phím không được tìm thấy khi cố gắng trả lại một mặt hàng hiện có, một khóa mới được tạo và mục tương ứng của nó bị để trống.

Tái tạo sự cố

Hãy tái tạo vấn đề để xem chính xác nơi mọi thứ đi ngang.

Hành vi mong đợi

Tạo quy trình mẫu sau:

Sub WatchOut()
    Dim MyDict As Dictionary
    Set MyDict = New Dictionary
    
    Debug.Print "KeyA exists? "; MyDict.Exists("KeyA")
End Sub

Chạy quy trình trên từ cửa sổ ngay lập tức và nó sẽ trả về False:

WatchOut
KeyA exists? False

Thêm đồng hồ

Bây giờ, hãy thêm một chiếc đồng hồ của mục "KeyA":

Hãy thử chạy WatchOut lại quy trình:

WatchOut
KeyA exists? False

Càng xa càng tốt. Có lẽ đây không phải là vấn đề.

Bước qua mã

Hãy thêm Dừng câu lệnh để buộc mã bị phá vỡ:

Sub WatchOut()
    Dim MyDict As Dictionary
    Set MyDict = New Dictionary
    
    Stop
    Debug.Print "KeyA exists? "; MyDict.Exists("KeyA")
End Sub

Bây giờ, hãy thử chạy WatchOut thói quen:

WatchOut
KeyA exists? True

Aha! Sự kết hợp của đồng hồ và đột nhập vào trình gỡ lỗi là đủ để buộc "lỗi" xuất hiện. Tôi đặt lỗi trong dấu ngoặc kép đáng sợ vì đó là hành vi thực sự được mong đợi đối với trình gỡ lỗi. Nhưng gần như chắc chắn đó là hành vi không mong đợi đối với nhà phát triển.

(Lưu ý rằng không có gì đặc biệt về Dừng lệnh gây ra hành vi này. Bạn có thể xóa Dừng dòng và đặt một điểm ngắt trên mã và hành vi tương tự sẽ xảy ra.)

Bạn có thể thấy nơi mà loại thứ này có thể khiến bạn kéo tóc ra trong khi gỡ lỗi. Bất cứ lúc nào hành vi của chương trình của bạn khác trong khi chạy bình thường so với khi đang gỡ lỗi, bạn đã có một phiên gỡ lỗi nghiêm trọng hơn.

Tóm tắt

Các bước để tái tạo sự cố:

  1. Tạo Đồng hồ cho một mục Từ điển cụ thể
  2. Đột nhập vào trình gỡ lỗi trong khi thực thi mã

Điều này có thể sẽ chỉ giúp được một hoặc hai nhà phát triển. Nhưng nó sẽ có khả năng tiết kiệm cho các nhà phát triển giờ của sự thất vọng. Và, nếu thành thật mà nói, tôi cũng như bất kỳ ai cũng có thể trở thành một trong những nhà phát triển đó;-).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cơ sở dữ liệu tuân thủ ODBC là gì?

  2. Sử dụng dữ liệu MS Access trong kết hợp thư

  3. Đặc điểm của một báo cáo

  4. Tham gia với chúng tôi để có Microsoft Access với SQL Server Academy Phần II

  5. 6 Sự Thật Thú Vị Về Microsoft Có Thể Bạn Chưa Biết!