2011-01-21 20 views
5

Có vẻ như tôi không phải là người duy nhất có vấn đề này, nhưng dường như không có vấn đề gì với vấn đề này.Các trường bool dễ vỡ trong các bảng được liên kết MS Access

Tôi đang làm việc trong Access 2010, sử dụng bảng được liên kết với cơ sở dữ liệu SQL Server 2005 (thông qua một ống ODBC của SQL Server). Trong bảng đó, một trong các trường boolean được đánh dấu là nullable và một số bản ghi trong bảng này thực tế có một null trong trường. Càng xa càng tốt.

Trong truy cập đi kèm, và ngay sau khi bạn mở bảng được nối kết, Access hiển thị 0 (sai) thay vì ô trống (vấn đề # 1). Và nếu bạn cố gắng sửa đổi bất cứ điều gì trong hồ sơ, bạn nhận được một thông báo lỗi nói rằng hồ sơ đã được sửa đổi bởi người khác và thay đổi của bạn không thể được lưu. Vấn đề cuối cùng này là do thực tế là Access không chấp nhận các trường bool nullable, và đi một chút hạt khi cố gắng lưu giá trị. Nghiên cứu của tôi cho thấy rằng điều này có thể có một cái gì đó để làm với truy cập bằng cách sử dụng máy bay phản lực trong nền để kết nối với cơ sở dữ liệu SQL Server, và máy bay phản lực dường như không hỗ trợ bool nullable. Có vẻ như không phải là một cách để cấu hình Jet để hỗ trợ điều này (mặc dù có lẽ có, nếu bạn đang kết nối trong mã). Tôi cũng nghĩ MS đã thay thế Jet bằng một công nghệ khác được sử dụng trong Office 2010 (ACE, tôi nghĩ), nhưng không thể biết đây có phải là những gì đang được Access sử dụng hay không. Trong cả hai trường hợp, tôi không thể tìm thấy các tùy chọn có thể cấu hình liên quan đến các bool nullable.

Cuối cùng, vấn đề này dường như đã được đưa lên đến MS trong một thời gian ngắn trước đây, nhưng không có câu trả lời trên cuối cùng của họ: https://connect.microsoft.com/SQLServer/feedback/details/617339/null-bit-fields-produce-spurious-ms-access-errors-when-using-the-native-odbc-driver?wa=wsignin1.0#tabs

Tôi tự hỏi nếu bất cứ ai khác ngoài kia đã chạy vào trong này và tìm thấy một dung dịch. Và trước khi bạn đề xuất nó, lấy tùy chọn nullable off và thiết lập tất cả các null thành 'false' không thực sự là một lựa chọn trong trường hợp của chúng ta. Đối với chúng tôi, null thực sự là một trạng thái hợp lệ và rất khác với 'false.

Thx!

+2

Đây là sự cố đã biết kể từ khi truy cập 97: http://support.microsoft.com/kb/278696/EN-US. Vì không có gì thay đổi trong 14 năm qua, tôi không mong đợi bất kỳ sửa chữa nào sớm ... – Heinzi

Trả lời

5

ACE là bản nâng cấp của Máy bay phản lực (được chia đôi từ mã máy bay phản lực 4.0, được nhóm Windows duy trì và không thấy thêm bất kỳ sự phát triển nào, trong khi ACE đang được đội ngũ Access phát triển đầy đủ). Nó không khác biệt đáng kể so với Jet, ngoại trừ trong đó nó là phiên bản mới của cơ sở dữ liệu và có các tính năng mà Jet thiếu.

Booleans không thể bỏ qua không phải là một trong các tính năng được thêm vào. Trong mọi trường hợp, nếu tôi không nhầm thì có những lý lẽ lý thuyết lớn về việc liệu Booleans có phải là Nullable và Jet/ACE đi xuống ở phía bên mà nói rằng họ không nên.

Không thể vô hiệu hóa Các vấn đề gây ra Booleans ngay cả trong Access/Jet/ACE (Allen Browne has discussed one such, with LEFT JOINs). Đề xuất của tôi là bạn thay đổi trường thành trường Nullable Bit, Byte hoặc Integer (tôi không chắc chắn loại dữ liệu chính xác nào nằm trong SQL Server, cũng như không tương thích với Access/Jet/ACE).

Ngoài ra, bạn có thể tiếp cận nó theo cách vấn đề BIGINT được xử lý bằng cách sử dụng dạng xem cho CAST() Boolean phía máy chủ đến INT. Điều đó làm cho nó không thể chỉnh sửa được nhưng (như với BIGINT), bạn có thể giữ trường gốc trong VIEW và ghi vào đó với các giá trị thích hợp, trong khi phiên bản CAST() chỉ để hiển thị. SS2 cho Access sẽ tăng kích cỡ của Jet/ACE Booleans lên các trường bit có thể vô hiệu hóa (không chắc chắn tại sao chúng là Nullable), tôi có thể cần phải kiểm tra một số ứng dụng của mình để đảm bảo chúng hoạt động chính xác!).

+0

Nullable Bit là tốt, tôi nghĩ vậy. –

+1

Xin chào, xin lỗi vì đã trả lời muộn. Tôi đã kiểm tra cơ sở dữ liệu SQL của chúng tôi, và nó đã là một bit vô giá trị. Không có kiểu trường nào khác cho phép dữ liệu kiểu boolean được lưu trữ trong nó, trừ khi tôi đi cho một hàm int vô giá trị và đặt một ràng buộc 0/1 vào nó. Đó là một lựa chọn, nhưng có hậu quả ở nơi khác. Không phải lựa chọn đầu tiên của tôi. –

+0

Re bình luận về SSMA upsizing bools để bit nullable - bạn có thể xây dựng trên đó một chút? Bạn đang đề cập đến một bảng Access với các trường bool trong nó đang được hiểu là một bit nullable khi kết nối với bảng thios? Tôi đang đi theo một hướng khác - bảng của tôi nằm trong SQL Server và tôi đang sử dụng Access để kết nối với nó ... –

0

Sau khi phân tích trong Microsoft KB http://support.microsoft.com/kb/318882 đây là những gì chúng tôi đã làm để giải quyết vấn đề này.1) Chúng tôi chạy một kịch bản sql để cập nhật các hàng trong bảng có giá trị rỗng trong các trường bit, 2) Sau đó chúng tôi sửa đổi định nghĩa bảng để bao gồm giá trị mặc định là '0' trong các trường bit đó.

+0

Đó là một bài viết thú vị. Tôi đã không có vấn đề như vậy với cơ sở dữ liệu cuối cùng tôi upsized (chạy A2003 với SQL Server Express 2008 R2), và tôi đã không cung cấp một giá trị mặc định cho các lĩnh vực Boolean. Tôi sẽ cần phải làm một kiểm tra, nhưng nếu vấn đề được trích dẫn đã xảy ra, tôi đã nhận được báo cáo lỗi lớn trong 6 tháng qua (mà tôi đã không), vì vậy nó có vẻ như phải có cái gì khác đang xảy ra . Có lẽ một cái gì đó đã được thay đổi giữa SQL 2005 và 2008. Tôi tự hỏi nếu tất cả các bảng của bạn có một PK và một lĩnh vực dấu thời gian? –