MS Access链接表中可以为空的bool字段

时间:2011-01-21 22:29:46

标签: sql-server ms-access nullable ms-jet-ace

看起来我不是唯一一个有这个问题的人,但似乎没有对这个问题感兴趣。

我在Access 2010中工作,使用链接表到SQL Server 2005数据库(通过SQL Server ODBC管道)。在该表中,其中一个布尔字段被标记为可为空,并且该表中的多个记录实际上在该字段中具有空值。到目前为止一切都很好。

在Access中,只要打开链接表,Access就会显示0(false)而不是空白单元格(问题#1)。如果您尝试修改记录中的任何内容,则会收到一条错误消息,指出该记录已被其他人修改,并且您的更改无法保存。最后一个问题是由于Access不能容忍可以为空的bool字段,并且在尝试保存值时有点疯狂。

我的研究表明,这可能与使用Jet在后台连接到SQL Server数据库的Access有关,而Jet显然不支持可空的bool。似乎没有办法配置Jet来支持这一点(尽管如果你在代码中连接,可能会有)。我还认为MS正在用Office 2010中使用的另一种技术取代Jet(ACE,我认为),但无法判断这是否是Access实际使用的内容。在任何一种情况下,我都找不到关于可空的bool的可配置选项。

最后,这个问题似乎很久以前就被提到了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!

3 个答案:

答案 0 :(得分:6)

ACE是Jet的升级版(源自Jet 4.0代码库,由Windows团队维护,没有看到任何进一步的开发,而ACE正在由Access团队完全开发)。它与Jet没有太大的不同,除了它是数据库引擎的新版本并且具有Jet缺乏的功能。

Nullable Booleans不是增加的功能之一。在任何情况下,如果我没有弄错,那么关于布尔人是否应该为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布尔值增加到可以为空的位字段(不知道为什么它们可以为Nullable - 我可能需要检查我的一些应用程序以确保它们正常工作!)

答案 1 :(得分:0)

按照此Microsoft KB http://support.microsoft.com/kb/318882进行分析 这是我们为解决这个问题所做的工作。 1)我们运行了一个sql脚本来更新该表中在位字段中具有空值的行,2)然后我们修改了表定义以在这些位字段中包含默认值“0”。

答案 2 :(得分:0)

我在项目中遇到了同样的问题,我从2000年代开始在旧的订购系统中实现了一些附加组件,并且布尔值被广泛使用。

今天,我通过使用以下传递查询找到了一种解决方案:

SELECT 
    *,  
    CASE MYFIELD 
       WHEN NULL THEN NULL 
       WHEN 1 THEN 1 
       WHEN 0 THEN 0 
    END AS MYRESULT
FROM 
    DBO.MYTABLE

这是不可更新的,但是无论如何常规SQL语句都可以在那里工作。