2011-01-21 60 views
5

看起來我並不是這個問題中唯一的一個,但似乎並沒有解決這個問題。MS Access鏈接表中的可空布爾值字段

我正在使用SQL Server 2005數據庫的鏈接表(通過SQL Server ODBC管道)在Access 2010中工作。在該表中,其中一個布爾字段被標記爲可空,並且該表中的幾個記錄實際上在該字段中具有空值。到現在爲止還挺好。

進來訪問,並且只要您打開鏈接表,Access顯示0(false)而不是空白單元格(問題#1)。如果您嘗試修改記錄中的任何內容,則會收到一條錯誤消息,指出該記錄已被其他人修改,並且您的更改無法保存。最後一個問題是由於Access不允許可空布爾字段,並且在嘗試保存該值時會有點麻煩。

我的研究表明,這可能與Access使用Jet在後臺連接到SQL Server數據庫有關,Jet顯然不支持可空布爾值。似乎沒有辦法配置Jet來支持它(儘管可能有,如果你使用代碼連接的話)。我還認爲MS正在用Office 2010中使用的另一項技術(ACE,我認爲)取代Jet,但無法分辨這是Access實際使用的內容。無論哪種情況,我都找不到關於可空布爾值的可配置選項。

最後,這個問題似乎已經在不久前提出了到MS,但有他們到底有沒有答案:如果任何人在那裏遇到了這一點,並找到了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

我想知道解。在你提出這個建議之前,關閉可空選項並將所有的空值設置爲「false」在我們的例子中並不是真正的選擇。對我們來說,null實際上是一個有效的狀態,與'false'非常不同。

Thx!

+2

這是自Access 97以來的一個已知問題:http://support.microsoft.com/kb/278696/EN-US。由於過去14年沒有任何變化,我不會期望任何修復很快... – Heinzi 2011-10-28 09:56:44

回答

5

ACE是Jet的升級版(由Jet團隊維護,由Windows團隊維護,沒有看到任何進一步的開發,而ACE正在由Access團隊全面開發)。它與Jet沒有什麼不同,除了它是數據庫引擎的新版本,並且具有Jet缺乏的功能。

可空布爾值不是其中的一個附加功能。無論如何,如果我沒有弄錯的話,關於布爾是否應該是Nullable,Jet/ACE是否應該是不應該的,他們會有大的理論爭論。

即使在Access/Jet/ACE(Allen Browne has discussed one such, with LEFT JOINs)中,不可爲空的布爾值也會導致問題。我的建議是將字段更改爲Nullable Bit,Byte或Integer字段(我不確定SQL Server中確切的數據類型,以及與Access/Jet/ACE最兼容的數據類型)。

或者,您可以通過使用對CAST()服務器端布爾值爲INT的視圖處理BIGINT問題的方式來處理它。這使得它是不可編輯的,但是(與BIGINT一樣),您可以將原始字段保留在VIEW中,並使用適當的值寫入該字段,而CAST()版本僅用於顯示。

對於它的價值,SSMA for Access將Jet/ACE布爾變成可空位域(不確定爲什麼它們是可空的,儘管 - 我可能需要檢查我的一些應用程序以確保它們工作正常! )。

+0

可空位是好的,我認爲。 – 2011-01-24 21:19:51

+1

嗨,對於遲到的回覆感到抱歉。我檢查了我們的SQL數據庫,它已經是一個空的位。沒有其他字段類型允許布爾型數據存儲在其中,除非我使用可爲空的int並在其上放置0/1的約束。這是一個選擇,但在其他地方有影響。不是我的第一選擇。 – 2011-01-28 20:52:06

0

繼微軟KB http://support.microsoft.com/kb/318882 分析後,我們做了解決這個問題。1)我們運行了一個sql腳本來更新該表中在位字段中有空的行,2)然後我們修改了表定義以在這些位字段中包含默認值'0'。