2011-01-21 65 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'。